题目描述
思路解析动画文字版
记住三个角色:prev(锚点·不动)、cur(区间头·会沉底)、nxt(每轮被头插的那个)。
prev 从头节点 1 起步,要走到第 1 个节点(区间 [2,9] 的前一个)当锚点。
prev 停在 1(区间前驱,整段头插期间它纹丝不动)。cur 指区间第一个 2——它最终会沉到区间末尾。准备头插。
第 1 轮:cur=2 后面的 3 就是这轮要头插的 nxt。先记住它,准备从链上摘下来插到 prev=1 之后。
把 3 从当前位置摘下来(它左边那根箭头先断成 ·)。因为已经用 nxt 记住了它,断了也不丢。
3 头插到 prev=1 正后方(箭头掉成 ←,变绿表示已就位)。它现在是区间已翻部分的新头。 cur 仍是 2,继续摘下一个。
第 2 轮:cur=2 后面的 4 就是这轮要头插的 nxt。先记住它,准备从链上摘下来插到 prev=1 之后。
把 4 从当前位置摘下来(它左边那根箭头先断成 ·)。因为已经用 nxt 记住了它,断了也不丢。
4 头插到 prev=1 正后方(箭头掉成 ←,变绿表示已就位)。它现在是区间已翻部分的新头。 cur 仍是 2,继续摘下一个。
第 3 轮:cur=2 后面的 5 就是这轮要头插的 nxt。先记住它,准备从链上摘下来插到 prev=1 之后。
把 5 从当前位置摘下来(它左边那根箭头先断成 ·)。因为已经用 nxt 记住了它,断了也不丢。
5 头插到 prev=1 正后方(箭头掉成 ←,变绿表示已就位)。它现在是区间已翻部分的新头。 cur 仍是 2,继续摘下一个。
第 4 轮:cur=2 后面的 6 就是这轮要头插的 nxt。先记住它,准备从链上摘下来插到 prev=1 之后。
把 6 从当前位置摘下来(它左边那根箭头先断成 ·)。因为已经用 nxt 记住了它,断了也不丢。
6 头插到 prev=1 正后方(箭头掉成 ←,变绿表示已就位)。它现在是区间已翻部分的新头。 cur 仍是 2,继续摘下一个。
第 5 轮:cur=2 后面的 7 就是这轮要头插的 nxt。先记住它,准备从链上摘下来插到 prev=1 之后。
把 7 从当前位置摘下来(它左边那根箭头先断成 ·)。因为已经用 nxt 记住了它,断了也不丢。
7 头插到 prev=1 正后方(箭头掉成 ←,变绿表示已就位)。它现在是区间已翻部分的新头。 cur 仍是 2,继续摘下一个。
第 6 轮:cur=2 后面的 8 就是这轮要头插的 nxt。先记住它,准备从链上摘下来插到 prev=1 之后。
把 8 从当前位置摘下来(它左边那根箭头先断成 ·)。因为已经用 nxt 记住了它,断了也不丢。
8 头插到 prev=1 正后方(箭头掉成 ←,变绿表示已就位)。它现在是区间已翻部分的新头。 cur 仍是 2,继续摘下一个。
第 7 轮:cur=2 后面的 9 就是这轮要头插的 nxt。先记住它,准备从链上摘下来插到 prev=1 之后。
把 9 从当前位置摘下来(它左边那根箭头先断成 ·)。因为已经用 nxt 记住了它,断了也不丢。
9 头插到 prev=1 正后方(箭头掉成 ←,变绿表示已就位)。它现在是区间已翻部分的新头。 区间内最后一个也翻好了。
区间 [2,9] 整段翻好:9→8→7→6→5→4→3→2。区间外的 1 和 10 一根箭头都没动。整条变成 1→9→8→7→6→5→4→3→2→10,返回头节点 1。
三个边界 dummy + 头插天然覆盖,不用额外分支。
两个高频追问,头插法是区间反转的最稳写法。
参考代码
def reverseBetween(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): # ② 头插 right-left 次 nxt = cur.next cur.next = nxt.next # 把 nxt 摘下 nxt.next = prev.next # nxt 插到 prev 之后 prev.next = nxt return dummy.next复杂度
- 时间:O(n),走到前驱 O(left),头插 O(right-left),合计一遍线性
- 空间:O(1),只用 dummy/prev/cur/nxt 几个指针,原地反转
易错点
面试追问把动画讲成自己的话
追问为什么用 dummy 哨兵?
追问和「先断出子链单独反转再接回」相比?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
复制带随机指针的链表
LeetCode 138 · 中等 · 沿着 链表套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题