leetcode203. Remove Linked List Elements

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

Given the head of a linked list and an integer val, remove all the nodes of the linked list that has Node.val == val, and return the new head.
套路 1

要想删除节点 node,必须在 node 的前一个节点执行删除操作。

例如链表 1→2→3,要想删除 2,必须在节点 1 处操作,也就是把节点 1 的 next 更新为节点 3。

套路 2

如果头节点可能被删除,那么要在头节点之前添加一个哨兵节点,这样我们无需特判头节点被删除的情况,从而简化代码逻辑。

或者说,根据套路 1,要想删除头节点,必须在头节点的前一个节点操作,所以要添加一个哨兵节点。

算法

复制代码
初始化哨兵节点 dummy,其 next 为 head。
遍历链表,初始化 cur=dummy。
循环直到 cur 的下一个节点为空。
如果 cur 的下一个节点的值等于 val,那么删除下一个节点,把 cur.next 更新为 cur.next.next。
如果 cur 的下一个节点的值不等于 val,那么不删除下一个节点,继续看下下一个节点是否要删除,即更新 cur 为 cur.next。
循环结束,返回 dummy.next,即删除节点后的新链表的头节点。

答疑

问:为什么没有修改 dummy,但 dummy.next 却是新链表的头节点?如果删除了 head,那么最后返回的是不是原链表的头节点?

答:注意初始化时,cur 和 dummy 都指向同一个节点,cur 和 dummy 只是同一个节点的引用,所以修改 cur.next 也会同时修改 dummy.next。

问:为什么删除下一个节点后,不需要更新 cur 为 cur.next?

答:删除下一个节点后,cur.next 的节点值也可能等于 val,也需要删除,如果直接更新 cur 为 cur.next,就漏删了节点。

python 复制代码
class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        cur = dummy = ListNode(next=head)
        while cur.next:
            if cur.next.val == val:
                cur.next = cur.next.next  # 删除下一个节点
            else:
                cur = cur.next  # 继续向后遍历链表
        return dummy.next
相关推荐
2601_9677607810 小时前
2026年PDF压缩与页码添加工具技术实测:性能、算法与本地化适配深度对比
算法·pdf
不会就选b10 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode
moonrailgun11 小时前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
罗西的思考11 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(1)--- 总体
人工智能·算法·机器学习
lvwangshu12 小时前
图论:LCA、树的直径、树的重心、二分图与 Tarjan 缩点
算法·图论
302wanger13 小时前
干与湿:AI 拿走脑力之后,人剩下什么
算法
计算机编程-吉哥14 小时前
脑肿瘤MRI智能识别系统:基于深度学习的像素级脑肿瘤语义分割平台【计算机毕业设计选题推荐】
人工智能·python·深度学习·算法·毕业设计·课程设计·大数据毕业设计选题推荐
用户2049375549514 小时前
端侧语音部署踩坑:模型能跑不等于终端真的能用
后端·算法
shehuiyuelaiyuehao14 小时前
算法39,位运算,消失的两个数字
java·数据结构·算法
ZiLing14 小时前
2026 ROS 2 Lyrical 踩坑实录(一):编译与依赖——rosdep、现代 CMake 与 CMake 4.x
算法