题目描述
思路解析动画文字版
「pre 跟在 cur 后面一步」是关键:删 cur 时要靠 pre.next 接到 cur 的下一个,所以必须有个「前驱」指针随时待命。
已经接好哑结点:dummy→6→6→1→2→6→3→4→6。pre 停在 dummy,cur 停在头节点 6。要删的值 val = 6。下面 cur 一格一格往后走,pre 紧跟其后。注意头节点也是 6,待会儿要靠哑结点把它删掉。
pre 在 哑结点,cur 在 6。问:cur 的值 6 等于要删的 6 吗?相等 → 命中!下一帧用 pre.next 跨过它,把它摘掉。
执行 pre.next = cur.next:把这个 6 摘掉(变灰、两侧箭头断成 ·),pre 留在原地不动(哑结点),cur 前进到 6。pre 不动是因为它后面接上的新节点还没检查过。
pre 在 哑结点,cur 在 6。问:cur 的值 6 等于要删的 6 吗?相等 → 命中!下一帧用 pre.next 跨过它,把它摘掉。
执行 pre.next = cur.next:把这个 6 摘掉(变灰、两侧箭头断成 ·),pre 留在原地不动(哑结点),cur 前进到 1。pre 不动是因为它后面接上的新节点还没检查过。
pre 在 哑结点,cur 在 1。问:cur 的值 1 等于要删的 6 吗?不相等 → 这个节点保留,下一帧 pre 跟上来。
执行 pre = cur、cur = cur.next:节点 1 确认保留(变绿),pre 跟到它上面,cur 前进到 2。pre 永远紧跟在 cur 前一格。
pre 在 1,cur 在 2。问:cur 的值 2 等于要删的 6 吗?不相等 → 这个节点保留,下一帧 pre 跟上来。
执行 pre = cur、cur = cur.next:节点 2 确认保留(变绿),pre 跟到它上面,cur 前进到 6。pre 永远紧跟在 cur 前一格。
pre 在 2,cur 在 6。问:cur 的值 6 等于要删的 6 吗?相等 → 命中!下一帧用 pre.next 跨过它,把它摘掉。
执行 pre.next = cur.next:把这个 6 摘掉(变灰、两侧箭头断成 ·),pre 留在原地不动(2),cur 前进到 3。pre 不动是因为它后面接上的新节点还没检查过。
pre 在 2,cur 在 3。问:cur 的值 3 等于要删的 6 吗?不相等 → 这个节点保留,下一帧 pre 跟上来。
执行 pre = cur、cur = cur.next:节点 3 确认保留(变绿),pre 跟到它上面,cur 前进到 4。pre 永远紧跟在 cur 前一格。
pre 在 3,cur 在 4。问:cur 的值 4 等于要删的 6 吗?不相等 → 这个节点保留,下一帧 pre 跟上来。
执行 pre = cur、cur = cur.next:节点 4 确认保留(变绿),pre 跟到它上面,cur 前进到 6。pre 永远紧跟在 cur 前一格。
pre 在 4,cur 在 6。问:cur 的值 6 等于要删的 6 吗?相等 → 命中!下一帧用 pre.next 跨过它,把它摘掉。
执行 pre.next = cur.next:把这个 6 摘掉(变灰、两侧箭头断成 ·),pre 留在原地不动(4),cur 前进到 空(链表末尾)。pre 不动是因为它后面接上的新节点还没检查过。
cur 走到链表末尾(空),遍历结束。灰掉的 4 个 6 都被摘掉了。最后返回 dummy.next —— 不管原来的头删没删,dummy.next 永远指向真正的新头,结果是 1→2→3→4。
空 / 全删 / 头删三种边界,哑结点 + 返回 dummy.next 的写法天然覆盖,不需要任何特判。
面试最爱追问「为什么要哑结点」——答案就是「把头删降级成普通删,消掉特判」。
参考代码
def removeElements(head, val): dummy = ListNode(0, head) # 哑结点接在头前 pre, cur = dummy, head while cur: if cur.val == val: pre.next = cur.next # 跨过 cur,pre 不动 else: pre = cur # 保留,pre 跟上 cur = cur.next return dummy.next复杂度
- 时间:O(n),cur 把每个节点恰好经过一遍
- 空间:O(1),只用 dummy/pre/cur 三个指针,原地改 next
易错点
面试追问把动画讲成自己的话
追问哑结点(dummy node)到底解决了什么问题?
追问能用递归解吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
反转链表
LeetCode 206 · 简单 · 沿着 链表套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题