https://leetcode.cn/problems/reverse-linked-list-ii/
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
class Solution:
def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
dummy = ListNode() # 链表发生变化,最终结果返回整条链,头节点可能会发生变动,所以设立哨兵节点
dummy.next = head
p = dummy # 遍历指针
# 第1步:构建反转函数,用于反转[left, right]之间的链表,参考 206. 反转链表
def reverse(head):
pre = None
cur = head
while cur:
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
return pre
# 第2步:找到反转链表的首尾节点,也就是left与right所在节点
# 指针遍历,往前走left - 1步,走到left的左侧
n1 = left - 1
while n1 > 0:
p = p.next
n1 -= 1
# 确定left位置的节点
left_node = p.next
# 确定right位置的节点
n2 = right - left + 1
right_node = p
while n2 > 0:
right_node = right_node.next
n2 -= 1
# 确定第3段链表的头节点
third_link_head = right_node.next
# 第3步:断开left与其左侧的节点,断开right与其右侧的节点
p.next = None
right_node.next = None
# 第4步:反转[left, right]之间链表
reverse(left_node)
# 第5步:重新连接3段链表并返回
p.next = right_node
left_node.next = third_link_head
return dummy.next