题目
题目描述
给你单链表的头指针 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
进阶: 你可以使用一趟扫描完成反转吗?
题解
解题思路
要反转单链表中从位置 left 到位置 right 的节点,并且只使用一趟扫描完成,可以按照以下步骤操作:
-
创建哑节点:为了简化边界条件处理(例如当
left为 1 时),可以在链表前添加一个哑节点。这样我们就不需要特别处理头节点的情况。 -
定位到反转起始点的前一个节点:使用一个指针遍历到第
left - 1个节点,这个节点将是反转部分的前驱节点。 -
反转指定范围内的节点:在找到反转起始点后,开始反转从
left到right的节点。这一步可以通过标准的链表反转算法来实现,但需要注意的是,我们只需要反转right - left + 1次。 -
重新连接链表:反转完成后,将反转后的子链表重新连接回原链表中。具体来说,就是将反转部分的前驱节点指向新的头节点,并将反转部分的尾节点(即原来的头节点)指向反转部分之后的第一个节点。
-
返回结果:最后返回更新后的链表头节点。如果原头节点没有被包含在反转范围内,则直接返回哑节点的下一个节点;否则返回哑节点的下一个节点作为新头节点。
python实现代码
以下是 Python 实现代码:
def reverseBetween(head: ListNode, left: int, right: int) -> ListNode:
if not head or left == right:
return head
# 创建哑节点并链接到头节点
dummy = ListNode(0)
dummy.next = head
prev = dummy
# 定位到反转起始点的前一个节点
for _ in range(left - 1):
prev = prev.next
# 开始反转的部分
start = prev.next # 反转部分的头节点
then = start.next # 用于遍历和反转的指针
# 反转指定范围内的节点
for _ in range(right - left):
start.next = then.next
then.next = prev.next
prev.next = then
then = start.next
return dummy.next
提交结果

3万+

被折叠的 条评论
为什么被折叠?



