LeetCode 92. 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]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
解题思路
方法:迭代
思路:
- 创建虚拟头节点,方便处理边界情况
- 找到反转部分的前一个节点
prev - 找到反转部分的第一个节点
curr - 对反转部分进行迭代反转:
- 保存下一个节点
next_node - 将当前节点的
next指向前一个节点 - 移动前一个节点和当前节点
- 保存下一个节点
- 连接反转部分与原链表
复杂度分析:
- 时间复杂度:O(n),其中 n 是链表的长度。只需要遍历链表一次。
- 空间复杂度:O(1),只需要常数级的额外空间。
代码实现
方法:迭代
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
# 创建虚拟头节点,方便处理边界情况
dummy = ListNode(0, head)
# 找到反转部分的前一个节点
prev = dummy
for _ in range(left - 1):
prev = prev.next
# 找到反转部分的第一个节点
curr = prev.next
# 对反转部分进行迭代反转
for _ in range(right - left):
next_node = curr.next
curr.next = next_node.next
next_node.next = prev.next
prev.next = next_node
return dummy.next
测试用例
测试用例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
测试用例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
测试用例 3:
输入:head = [1,2,3,4,5,6], left = 2, right = 5
输出:[1,5,4,3,2,6]
总结
本题是链表操作的经典应用问题,主要考察对链表反转的理解和使用。通过使用迭代的方法,我们可以高效地反转链表的指定部分。
迭代的核心思想是:找到反转部分的前一个节点和第一个节点,然后对反转部分进行迭代反转,最后连接反转部分与原链表。
这种方法不仅适用于反转链表 II 问题,还可以应用于许多其他需要反转链表部分的问题。掌握链表反转的技巧,对于解决这类问题非常重要。
524

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



