92. 反转链表 II
解
- 遍历翻转
- 保存将来要用的节点
- 翻转部分头部的前一个节点
- 翻转部分尾部节点
- 翻转后 更新cur 所需要的节点
# 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 not head.next:
return head
pre = None
cur = head
# 移动cur指向位置m
for i in range(m - 1):
pre = cur
cur = cur.next
# 保存翻转部分头部的前一个节点
t1 = pre
# 保存翻转部分尾部节点
t2 = cur
pre = cur
cur = cur.next
for i in range(n - m):
# 更新 cur 时 要用到此时cur的next
temp = cur.next
# 翻转
cur.next = pre
# 更新
pre = cur
cur = temp
if m == 1:
# 当 m == 1, 即头部要加入翻转时
head = pre
t2.next = cur
else:
# 翻转部分头部的前一个节点 指向 翻转部分头部
# 此时 pre 指向翻转部分头部
t1.next = pre
# 翻转部分尾部 指向 后一个节点
# 此时 cur 指向翻转部分尾部的后一个节点
t2.next = cur
return head