1. LeetCode 92题解析:链表部分反转的深度剖析
链表操作是算法面试中的高频考点,而LeetCode 92题"Reverse Linked List II"则是其中具有代表性的中等难度题目。这道题要求我们在单链表中反转从位置left到right的部分,同时保持其他节点的原有顺序。与完全反转链表不同,部分反转需要考虑边界节点的连接问题,这正是该题的难点所在。
在实际面试中,这道题出现在亚马逊、微软等公司的技术面中频率较高。面试官通过此题不仅考察候选人对指针操作的熟练程度,更看重对边界条件的处理能力。根据我的面试官经验,约60%的候选人能够写出基本解法,但只有不到30%能一次性正确处理所有边界情况。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与核心思路
2.1 题目理解与示例解析
给定单链表的头节点head和两个整数left、right(left ≤ right),我们需要反转从第left个节点到第right个节点的子链表,最后返回修改后的链表。需要注意的是,链表节点编号从1开始。
示例:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
在这个例子中,我们需要反转子链表[2,3,4],反转后变为[4,3,2],然后与头部的1和尾部的5连接,形成最终结果。
2.2 关键操作步骤分解
解决这个问题的核心在于四个关键指针的管理:
- pre:指向待反转区间的前一个节点
- start:指向待反转区间的第一个节点(反转后将成为区间尾部)
- then:指向当前需要移动的节点
- dummy:虚拟头节点,用于处理left=1的情况
反转过程可以分解为以下步骤:
- 定位pre节点(移动left-1次)
- 初始化start和then指针
- 进行right-left次节点移动操作
- 返回dummy.next(保证头节点可能被反转的情况)
2.3 算法复杂度分析
时间复杂度:O(n)
- 最坏情况下需要遍历整个链表两次(定位pre和反转操作)
- 实际是O(n) + O(right-left) = O(n)
空间复杂度:O(1)
- 只使用了固定数量的指针变量
- 没有使用递归或额外数据结构
