LeetCode 92中等链表 · 局部反转
反转链表 II 图解题解
这道题到底在问什么
反转链表从 left 到 right 的一段,其他部分保持不变。
- 输入
- 1→2→3→4→5, left=2, right=4
- 输出
- 1→4→3→2→5
最优解:一步一步想明白
- 3关键不是背模板,而是看懂为什么这题适合链表 · 局部反转。
- 4dummy 保护头节点dummy 保护头节点
- 5prev 走到 left 前一个节点 1prev 走到 left 前一个节点 1
- 6cur 指向区间第一个节点 2cur 指向区间第一个节点 2
- 7把 3 摘出来插到 prev 后面把 3 摘出来插到 prev 后面
- 8链表变成 1→3→2→4→5链表变成 1→3→2→4→5
- 9再把 4 摘出来插到 prev 后面再把 4 摘出来插到 prev 后面
- 10链表变成 1→4→3→2→5链表变成 1→4→3→2→5
- 11区间反转完成,返回 dummy.next区间反转完成,返回 dummy.next
- 14把这句话记住,下次遇到同类题,就能更快选出方向。
⚠️ 容易写错的地方
✗ 错:先断开区间再反转,忘记接回去
✓ 对:用 dummy + 头插法保持两端连接
断链后最容易丢尾巴
✗ 错:只按样例推代码
✓ 对:先写清状态含义和边界条件
样例太少,隐藏用例专打边界
✗ 错:变量名和动画不一致
✓ 对:代码变量沿用动画里的核心名字
学习时最怕脑内维护两套概念
完整代码(Python)
Python
class Solution:
def reverseBetween(self, head, left, right):
dummy = ListNode(0, head)
prev = dummy
for _ in range(left - 1):
prev = prev.next
cur = prev.next
for _ in range(right - left):
nxt = cur.next
cur.next = nxt.next
nxt.next = prev.next
prev.next = nxt
return dummy.next套路模板 · 链表 · 局部反转
# 链表 · 局部反转 通用检查表
# 1. 定义状态/指针/容器
# 2. 每轮只做一个清晰动作
# 3. 更新答案并处理边界复杂度
时间复杂度
O(n)
每个核心状态按算法要求处理固定次数
空间复杂度
O(1)
只保存必要的辅助结构或递归栈
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 反转链表 II 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
这道题为什么用「局部反转」,换最直接的暴力解会差在哪?+
局部反转抓住了本题的结构特征,把暴力解里重复的工作省掉;暴力解通常要多嵌套一层枚举,数据一大就超时。具体对比见上文「暴力解及其卡点」与「最优解逐步推演」两节。
时间复杂度为什么是 undefined?怎么推出来的?+
按上文复杂度小节的推导,时间复杂度为 undefined。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。