首页 > 其他分享 >力扣: 移除链表元素

力扣: 移除链表元素

时间:2024-08-23 11:26:27浏览次数:14  
标签:力扣 head val current 结点 next 链表 移除

文章目录

在这里插入图片描述


需求

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

示例1:

在这里插入图片描述

输入: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
输出:[]

提示:

列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50


虚拟头结点法

虚拟头结点法就是, 构建一个虚拟的节点, 指向真正的头结点前面, 这样好遍历链表.

public ListNode removeElements(ListNode head, int val) {
    if( head == null ){
        return null;
    }
    //  构造一个head的前置节点
    ListNode preHead = new ListNode(-1, head);
    ListNode current = preHead;

    while( current.next != null ){
    	//	满足移除的条件 移除
        if( current.next.val == val ){
            current.next = current.next.next;
        }else{
        	//	不移除
            current = current.next;
        }
    }
    return preHead.next;
}

运行后:

在这里插入图片描述

上面的代码一定要注意的是, 在遍历的过程中, 满足条件移除后,不要改变当前节点, 因为 current.next = current.next.next; 有可能 当前节点的下一个新节点也是要移除的, 如果这个时候 current = current.next; 那就会有遗漏. 所以核心逻辑要写成下面的样子:

在这里插入图片描述


原头结点法

虚拟头结点有一个好处就是能够判断真正的头结点是不是要移除的元素. 那现在我们不适用虚拟头结点了, 那就得自己判断 head 是不是要移除的元素的逻辑了.

判断 head 是不是要移除的元素的逻辑如下:

//  当 头结点是 要移除的元素的时候 处理之
while( head != null && head.val == val ){
    head = head.next;
}
public ListNode removeElements(ListNode head, int val) {
    //  当 头结点是 要移除的元素的时候 处理之
    while( head != null && head.val == val ){
        head = head.next;
    }
    if( head == null ){
        return null;
    }
    ListNode current = head;
    while( current.next != null ){
        if( current.next.val == val ){
            current.next = current.next.next;
        }else{
            current = current.next;
        }
    }
    return head;
}

运行很丝滑…

在这里插入图片描述


结尾

以上 是我对这道算法的一些遐想和延伸, 可能不是最优解, 但是算法的优化嘛 本身就是一个思索的过程, 能在这个思索和迭代的过程中有所收获和乐趣就是在成长了, 欢迎大家一起来交流更多的解答…



标签:力扣,head,val,current,结点,next,链表,移除
From: https://blog.csdn.net/Snowyyds/article/details/141459952

相关文章

  • 【408DS算法题】022基础-递增输出单链表中的结点值
    Index题目分析实现总结以上内容稍后补全,以下内容来自https://blog.csdn.net/weixin_60702024/article/details/141336041题目分析实现总结分析题目给定单链表的头结点,按照递增的顺序,输出单链表结点的值。分析实现具体实现如下:总结注意delete执行后,只会将......
  • C++ 链表
    1.前言链表:不仅存储 当前元素的数据,还存储着 元素排列顺序2. 正题2.1如何存储节点?我们可以使用结构体 数组来存储 链表节点structNode{intval;//可以是string或其它复杂的类型intnxt;}node[N];Tip:下标顺序不是单链表顺序 val代表 元......
  • 数据结构--链表(单向链表--有头链表、无头链表)链表的插入、删除、修改、查找
    什么是链表?链表是一种基本的数据结构,用于存储一组数据元素。与数组不同,链表的元素在内存中并不连续存储。链表由一系列节点组成,每个节点包含以下两个主要部分:1.数据部分:存储节点所包含的数据。2.指针部分:存储指向下一个节点的指针(对于单向链表),或者存储指向前一个节点和下......
  • 数据结构之链表(看不懂你来找我)
    数据结构......
  • 给自己复盘的随想录笔记-移除元素
    双指针法双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。定义快慢指针快指针:寻找新数组的元素,新数组就是不含有目标元素的数组慢指针:指向更新新数组下标的位置相关题目删除有序数组中的重复项解题思路:解法:双指针首先注意数组......
  • 76. 最小覆盖子串【 力扣(LeetCode) 】
    一、题目描述给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串“”。注意:对于t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。如果s中存在这样的子串,我们保证......
  • 48. 旋转图像【 力扣(LeetCode) 】
    一、题目描述给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。二、测试用例示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4......
  • 力扣:有效的数独
    文章目录需求分析结尾需求请你判断一个9x9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字1-9在每一行只能出现一次。数字1-9在每一列只能出现一次。数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图)......
  • 链表的一些常用函数
    本文用一个相同的主函数和结构体来讲述链表的14种常见函数主函数和结构体#include<stdio.h>#include<stdlib.h>typedefstructnode{ intnum; structnode*p_next;}node;typedefstruct{ nodehead; nodetail;}link;intmain(){ linklnk={0}; li......
  • 数据结构链表入门指南 链表基本代码实现以及测试步骤
    链表介绍链表是一种数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。链表的基本特性包括:动态大小:链表的大小可以根据需要动态调整,不像数组那样需要事先定义固定大小。节点连接:每个节点通过指针连接到下一个节点,从而形成一个链状结构。灵活插入和......