题目描述
思路解析动画文字版
关键不是背模板,而是看懂为什么这题适合链表 · 局部反转。
1. dummy 哨兵保护头:在头部加一个 dummy 哨兵指向 1,避免反转段包含头节点时要特判。
2. prev 到 left 前一个(值1):left=2,prev 停在区间前一个节点 1;cur 指向区间第一个节点 2。
3. 准备头插:cur=2 是区间第一个,它会一直待在原地、逐渐沉到区间末尾;每轮把 cur 后面的节点摘下、插到 prev 之后。共做 right−left=2 次。
4. 第1次头插: 摘 3 插到 prev 后:nxt = cur.next = 3。把 3 摘下、插到 prev(1) 后面:链表变成 1→3→2→4→5。cur 仍是 2。
5. 第2次头插: 摘 4 插到 prev 后:此时 cur(2) 的下一个是 4。把 4 摘下、插到 prev(1) 后面:链表变成 1→4→3→2→5。
6. 区间反转完成:已做 2 次头插(right−left=2),区间内 2,3,4 的顺序反转成 4,3,2。
7. 返回 dummy.next:返回 dummy.next,也就是新链表头 1。
8. 结果:最终链表 1→4→3→2→5。头插法一趟扫描完成,时间 O(n)、空间 O(1)。
把这句话记住,下次遇到同类题,就能更快选出方向。
参考代码
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复杂度
- 时间复杂度:O(n),每个核心状态按算法要求处理固定次数
- 空间复杂度:O(1),只保存必要的辅助结构或递归栈
可套用的代码模板
模板不是死背,而是提醒你写代码前先把状态、转移和边界排好。
Python
# 链表 · 局部反转 通用检查表# 1. 定义状态/指针/容器# 2. 每轮只做一个清晰动作# 3. 更新答案并处理边界易错点
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
复制带随机指针的链表
LeetCode 138 · 中等 · 沿着 链表套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题