思路:
- 一定要画图找思路
- 头节点会变化,所以创建虚拟头节点
步骤:
定四位转两针
1、先把a,b,c,d四个位置确定,a是b的前一个位置,d是c的后一个位置; b,c分别为第m,n个节点
2、将m到n位置之间的指针翻转(不包括第m个节点)
# 此处同三指针法两两改向三板斧
3、将b的指针指向c,将a的指针指向d
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
if m == n:
return head
dummy = ListNode(-1)
dummy.next = head
# 找到四个节点的位置
a = dummy; c = dummy
for i in range(m-1): # 找第m-1个位置,在头节点往后移动m-2步
a = a.next
for j in range(n): # 找第n个位置
c = c.next
b = a.next; d = c.next
# 双指针法每次更改一条边的方向
p = b; q = b.next
while q != d:
r = q.next
q.next = p
p, q = q, r
# 最后更改a,b的指向
a.next = c
b.next = d
return dummy.next