🧠 链表过滤(dummy + prev + curr)通过遍历链表,将满足特定条件(如值等于 target)的节点通过修改指针“跳过”并移除,从而得到一个清洗后的新链表

一句话结论:

👉 LeetCode 中 所有可能删除头节点的链表题
👉 本质上 都可以反向映射为同一个删除模板

⭐ 模板

  1. 建立虚拟头,处理边界

    //创建 dummy 节点,dummy.next 指向 head
    ListNode dummy = new ListNode(0,head);

  2. 创建探险家 curr 和接线员
    prev 指向 dummy // 当前已经确认保留链表的最后一个节点
    curr 指向 head // 当前正在判断的节点

  3. 遍历链表

    while (curr != null) {

    if (curr 满足【删除条件】) {
    //【核心动作】:剪断链接!
    // 让 prev 的指针越过 curr,直接连到 curr 的下一位
    prev.next = curr.next

    // 注意:此时 prev 不要动!因为新接过来的 prev.next 还没检查过,下一轮循环要检查它
    }
    else (不需要删除):{
    //更新 prev
    prev = curr
    }

    //【迭代】:无论删没删,探险家都要去下一个地方看看
    curr = curr.next

    }

  4. 返回结果
    return dummy.next

三大角色(必须先记住)

dummy -> prev -> curr -> curr->next -> …

指针 角色 一句话职责
dummy 哨兵节点 保住链表入口,统一头删
prev 接线员 指向最后一个“已确认保留”的节点
curr 探险家 当前正在判断删不删的节点

👉 核心口诀:

  • ✅ curr 每轮都要前进
  • ❌ prev 只有在 curr 被保留时才前进

相关练习题

1. LeetCode 203. 移除链表元素

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

2. LeetCode 83. 删除排序链表中的重复元素

题意: 删除排序链表中的重复元素,只保留一个元素。

3. LeetCode 82. 删除排序链表中的重复元素 II

题意: 删除排序链表中的所有重复元素,只保留没有重复的节点。