【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;
    }
}
相关推荐
kobesdu16 小时前
人形机器人SLAM:技术挑战、算法综述与开源方案
算法·机器人·人形机器人
椰羊~王小美18 小时前
随机数概念及算法
算法
阿Y加油吧18 小时前
算法实战笔记:LeetCode 169 多数元素 & 75 颜色分类
笔记·算法·leetcode
不要秃头的小孩18 小时前
力扣刷题——509. 斐波那契数
python·算法·leetcode·动态规划
We་ct19 小时前
LeetCode 120. 三角形最小路径和:动态规划详解
前端·javascript·算法·leetcode·typescript·动态规划
py有趣19 小时前
力扣热门100题之和为K的子数组
数据结构·算法·leetcode
hipolymers20 小时前
C语言怎么样?难学吗?
c语言·数据结构·学习·算法·编程
海清河晏11121 小时前
数据结构 | 双循环链表
数据结构·链表
workflower21 小时前
机器人应用-楼宇室内巡逻
大数据·人工智能·算法·microsoft·机器人·动态规划·享元模式