【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;
    }
}
相关推荐
徐小夕24 分钟前
表格、文档、甘特、大屏、表单一站打通:pxcharts超级表格4.0正式上线!
前端·算法·github
Xin77030 分钟前
LeetCode 23.合并 K 个升序链表(分治递归)
leetcode
TechLee1 小时前
跨语言加解密总对不上?这个纯 Go 神库让 AES/RSA 与 PHP、Java 100% 互通
java·后端·算法
月华路3 小时前
G1 新生代对象晋升老年代:实现机制与 GC 日志
java·jvm·算法
万法若空3 小时前
排列组合恒等式
c++·算法
Nil2083 小时前
leetcode 105从前序和中序遍历序列构造二叉树
算法·leetcode·职场和发展
一直C3 小时前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表
淡海水3 小时前
04-02-哈希-Dictionary-TKey-TValue-上-核心数据结构
数据结构·算法·c#·哈希算法·编译·字典·dictionary
戴西软件4 小时前
国内有哪些数据轻量化格式转换软件?
数据库·算法·安全·信息可视化·自动化·rpa
老洋葱Mr_Onion4 小时前
【C++】CSP-J初赛模拟卷七错题整理(作者自用)
c++·算法·深度优先