题目:
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
提示:
-
链表中节点数目为 n
-
1 <= n <= 500
-
-500 <= Node.val <= 500
-
1 <= left <= right <= n
思路如下:
这道题是206题反转链表的进阶版,指定了反转链表内部的范围,在此基础上考虑指定范围反转后的内部链表与外部链表链接关系。
当left=1时,需要在head前插入哨兵节点dummy。
题解如下:
class Solution:
def reverseBetween(self, head, left, right):
"""
:type: head: Optional[ListNode], left: int, right: int
:rtype: Optional[ListNode]
"""
p0 = dummy = ListNode(next=head) # 创建虚拟头节点,便于处理头节点可能被反转的情况
for _ in range(left - 1): # 将p0移动到待反转部分的前一个节点
p0 = p0.next
# 反转子链表
pre = None
cur = p0.next
for _ in range(right - left + 1):
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
# 将反转后的子链表与前后部分连接
p0.next.next = cur # 原反转部分的头节点(现尾节点)指向剩余链表
p0.next = pre # 前驱节点指向反转后的头节点
return dummy.next