【LeetCode】203. 移除链表元素(Remove Linked List Elements)

题目

要求:给你链表头结点 head 和整数 val,删除链表中所有 Node.val == val 的节点,返回删除后的新头结点。

输入:head = 1,2,6,3,4,5,6, val = 6

输出:1,2,3,4,5

示例 2:

输入:head = \[\], val = 1

输出:\[\]

示例 3:

输入:head = 7,7,7,7, val = 7

输出:\[\]

https://leetcode.cn/problems/remove-linked-list-elements/

思路

哑结点 dummy + 前驱指针 prev

  • cur.val == val时(需要删除):

    • prev.next = cur.next:让prev跳过cur,直接指向cur的下一个节点
    • cur = cur.nextcur移动到下一个节点(注意此时prev不动)
  • cur.val != val时(保留):

    • prev = cur:prev向前移动到cur的位置

    • cur = cur.nextcur向前移动

哑结点 dummy简介

哑结点(dummy/sentinel)就是在真正链表头前面,人为加一个"永远不删/不参与数据"的节点 ,它的 next 指向原来的 head

为什么要用它统一删除逻辑 。不管你删的是头结点、中间结点还是尾结点,都变成用前驱节点 prev 去改指针:prev.next = cur.next,不需要专门处理删头结点这种特例。

code

java 复制代码
class Solution {
    public ListNode removeElements(ListNode head, int val) {
       ListNode dummy = new ListNode(0, head);
       ListNode prev = dummy, cur = head;
       while(cur!=null){
        //删除
        if(cur.val==val){
            prev.next=cur.next;
            cur=cur.next;
        }else{
            prev=cur;
            cur=cur.next;
        }
       }
       return dummy.next;
    }
}
相关推荐
带多刺的玫瑰3 分钟前
Leecode#35刷题之搜索插入位置
java·python·算法
我不会起名字32225 分钟前
万字总结Golang入门项目
数据结构·经验分享·算法·golang·项目实战·复盘
6Hzlia28 分钟前
【Classic 150 刷题计划】 LeetCode 14. 最长公共前缀 | C++ 纵向扫描法与防越界细节
c++·算法·leetcode
Niuguangshuo9 小时前
论文解读:CTC,端到端序列识别的开山之作
算法·语音识别
讳疾忌医丶9 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
高亦真9 小时前
今天是学习嵌入式的第37天
linux·学习·算法
罗西的思考11 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
深圳市方中禾科技12 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led
我不会起名字32213 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
huang57914715 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法