【Leetcode】单链表 ---移除链表元素(创建虚拟头节点)

news2025/2/26 19:55:11

移除链表元素

  • 移除链表元素
  • 题目思路
  • 图解
    • 创建虚拟头结点
    • 删除操作
  • 代码

移除链表元素

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

题目思路

题目思路:
①要考虑到,在给链表中,被删除的链表元素可能是中间或者尾结点,但也可能是头结点。
首先,可以直接想到的是,对头节点是要被删除元素进行单独讨论。
但是,我们可以寻求更高效率的更直接的办法,就是 创建一个 虚拟结点(dummy),使得虚拟节点指向头节点。
②当我们要返回时,返回虚拟节点(dummy)的next即可。
③遍历,我们要定义一个指针去遍历整个链表,即定义cur指针即可(当前指针current),让cur指针初始指向dummy这个虚拟结点即可。
④条件判断,我们直接根据cur所指的结点的下一个结点的值是否等于val来判断进行删除。
⑤若进行删除,则,使得 cur->next=cur->next->next;即可。
⑥若不进行删除,则 cur=cur->next;

图解

下面,我将根据自己的理解发出直观的图解。
假设,一个简单的链表:

这是很直接的逻辑图,即从图中,我们看到,头指针head指向了结点值为1的结点,结点值为1的结点指向了结点值为2的结点,结点值为2的结点指向了结点值为3的结点……结点值为6的结点指向了不指向任何数据的指针。

为了加深理解,我们根据逻辑图画出其物理图

物理图与逻辑图最根本的区别是物理图里没有逻辑图中的形象的箭头,这里是其本质的地址间的联系。
head指向结点值为1的结点即为 head中存放的是结点值为1的结点的地址。结点值为1的结点指向结点值为2的结点,其本质是,结点值为1的结点中的next域存放的是结点值为2的结点的地址……

创建虚拟头结点

//使用malloc函数在堆上开辟一个虚拟头节点
struct ListNode* dummy=(struct ListNode*)malloc(sizeof(struct ListNode))

在函数内部创建变量 dummy,其变量位置在栈上。
malloc函数在堆上开辟 struct ListNode这个结构体大小 的内存空间,并返回这块空间的地址。我们让dummy这个变量来管理堆上的这块内存。

之后,为了能够让我们创建的这个虚拟节点和我们原来的链表“线性连接”,我们给我们创建的这个虚拟头节点的next域赋值。

dummpy->next=head;

然后,我们就可以将我们创建的头节点和原来我们的链表“连接成线”了。

删除操作

利用cur指针进行遍历,循环的条件是

while(cur->next!=NULL)
{
   if (cur->next->val==val)
   {
       cur->next=cur->next->net;
   }
   else
   {
       cur=cur->next;
   }
}

(这里对于初学者来说很容易出错!)
这里简单说明一下 while(cur->next)!=NULLwhile(cur!=NULL)的区别。


我们可以看到如果是下面这种情况,cur指针依次访问,……访问到结点值为6的结点,然后指针移动,访问其后的空指针,然后不符合条件,不进入循环,(指针最后只在了最后的位置。)
问题主要出在了,当我们访问结点为6的结点时,不能访问cur->next->val,即不能访问NULL的val域,这样是非法访问了。

举个例子,若我们要删除的是结点值为3的结点:


那么更改cur->next:

如果cur指针所指向的结点的值不等于val的话,那么使val指针移动即可。

代码

 struct ListNode {
      int val;
      struct ListNode *next;
 };

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode *p=head;struct ListNode *q=NULL;

    //创建虚拟头节点
    struct ListNode *dummy=(struct ListNode*)malloc(sizeof(struct ListNode));
    dummy->next=head;
    struct ListNode *cur=dummy;
    while(cur->next!=NULL)
    {
        if(cur->next->val==val)
        {
            cur->next=cur->next->next;
        }
        else{
        cur=cur->next;}
    }
    return dummy->next;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

acme.sh签发和部署ZeroSSL泛域名证书

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。 介绍 acme.sh 是个开源的shell证书生成脚本,他可以自动生成Let’s Encrypt 的证书…

【Spring Cloud Alibaba】seata分布式事务官方入门案例导读1(实战版)

文章目录 1. 业务介绍1.1. 用例1.2. 架构图1.3. 3个服务的代码及业务逻辑(略) 2. SEATA 的分布式交易解决方案3. 由Dubbo SEATA提供支持的示例(实战)3.1. 步骤 1:建立数据库,如seata数据库3.2. 步骤 2&…

速锐得解码匹配特斯拉电动汽车安全性能检测车架号及BMS电池数据

电动汽车三大件分别是电池、电机和电控。到目前为止,电机技术已经非常成熟,直流永磁电机、永磁同步电机已经取代了异步电机,成为电动汽车的主流。很多人认为电动汽车最后一道技术门槛是电池,但在我国,汽车制造商在制造…

VMware虚拟机中ubuntu网络连接不上

VMware虚拟机中ubuntu中网络连接不上 解决方案其他虚拟机网络 解决方案 1.选择VMware中编辑-虚拟网络编辑器-更改: 设置为你喜欢的模式,这里为NET模式 2.选中ubuntu虚拟机(关机后的虚拟机),点击:编辑虚拟机…

微信视频号的项目玩法,视频号好物分享,只要你会剪辑,就可以去操作

今天我给大家分享一个超有趣的项目玩法——视频号好物分享! 你知道吗,不论是在抖音还是快手、小红薯,这类好物分享账号都是非常流行的。 不过,现如今这些账号已经不再只是简单的分享,而是有目的地进行推荐,…

【面试经典150 | 哈希表】快乐数

文章目录 写在前面Tag题目来源题目解读解题思路方法一:哈希集合判重方法二:快慢指针判重 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为…

【COMP305 LEC6 LEC 7】

LEC 6 Topic 2. The McCulloch-Pitts Neuron (1943) 1. What kind of propositions can be represented by a single MP neuron (without time)? OR: 中间那条线就是 a1 a2 1 分成了两半:1. on the line 和 above the line 2. below the line …

【计算机网络】NAT机制的工作流程

网络地址转换(NAT)是一种将私有IP地址转换为公共IP地址的技术,它使得私有网络中的主机可以在互联网上与外部主机进行通信。NAT机制在路由器或专用NAT设备上配置,可以用于家庭、小型企业或大型企业的网络环境中。本文将总结NAT机制…

flutter开发实战-打包应用apk签名及Android studio没有generate signed bundle/apk问题修改

flutter开发实战-打包应用apk签名及Android studio没有generate signed bundle/apk问题修改 最近使用flutter开发项目,需要将打包应用时候apk进行签名,我这边开发使用的是Android studio,发现在Android studio的build没有generate signed bu…

读高性能MySQL(第4版)笔记18_扩展MySQL

1. 增长 1.1. 在高速的业务环境中,流量可能逐年增长几个数量级,环境会变得更加复杂,随之而来的数据需求也会快速增加 1.2. 扩展Web服务器 1.2.1. 在负载均衡的后端添加更多的服务器节点,而这通常就是扩展We b服务器的全部工作 …

【银河麒麟系统】备份还原工具显示“备份分区空间不足,请删除过期或者不需要的备份”解决方法

一.问题的现象 在进行银行麒麟V10的系统备份时,会因为所需备份的系统过大导致备份分区容量不足导致备份失败的情况: 二.解决方法 该问题的处理思路与之前写过的一篇文章:【linux】把home目录挂载到其他分区(数据盘/data等&#xf…

Day8力扣打卡

打卡记录 查找和替换模式&#xff08;哈希表 / find函数查询重复程度&#xff09; 链接 1.hash表双映射检测是否存在相同映射。 2.利用string的find函数返回下标来检测对应字符串的重复程度(妙)。 class Solution { public:vector<string> findAndReplacePattern(vect…

Web APIs——事件监听以及案例

1、事件监听 什么是事件&#xff1f; 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为绑定事…

基于斑点鬣狗算法的无人机航迹规划-附代码

基于斑点鬣狗算法的无人机航迹规划 文章目录 基于斑点鬣狗算法的无人机航迹规划1.斑点鬣狗搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用斑点鬣狗算法来优化无人机航迹规划。 …

LiveGBS流媒体平台GB/T28181常见问题-海康大华宇视硬件NVR摄像头通道0未获取到视频通道如何排查如何抓包分析

LiveGBS常见问题海康大华宇视硬件NVR摄像头通道0未获取到视频通道如何排查如何抓包分析&#xff1f; 1、硬件NVR配置接入示例2、通道数为0处置2.1、判断信令是否畅通2.1.1、点击更新通道2.1.2、有成功提示2.1.2.1、确认设备的视频通道编码是否填写2.1.2.2、确认是否超过授权数目…

【ArcGIS模型构建器】03:多个shp批量按属性分割(多个县区批量提取乡镇)

文章目录 一、数据预览二、模型构建三、保存模型一、数据预览 加载实验数据: 本试验实现将两个县区的数据分割为乡镇数据。 二、模型构建 1. 添加数据文件夹 将县区数据所在的根目录文件夹拖进模型。 2. 添加要素类迭代器 插入→迭代器→要素类。 用连接工具,将数据文件…

【计算机网络笔记】网络应用的体系结构

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

【C++入门篇】保姆级教程篇【上】

目录 一、第一个C程序 二、C命名空间 1&#xff09;什么是命名空间&#xff1f; 2&#xff09;命名空间的使用 3&#xff09; std库与namespace展开 4&#xff09;命名空间的嵌套使用 三、输入输出方式 四、缺省参数 1&#xff09;什么是缺省参数&#xff1f; 2&#xff0…

html web前端 登录,短信验证码登录

html web前端 登录&#xff0c;短信验证码登录 1&#xff0c;手机号码格式校验 2&#xff0c;按钮点击60秒倒计时&#xff0c;按钮限制点击 3&#xff0c;验证码/或密码长度校验&#xff08;被注释&#xff0c;公司发的验证码长度不一致&#xff0c;不一定是6位&#xff09; 4…

LabVIEW应用开发——控件的使用(三)

接上文&#xff0c;这篇介绍簇Cluster控件。 LabVIEW应用开发——控件的使用&#xff08;二&#xff09; 1、簇Cluster 1&#xff09;创建 蔟控件又称为组合、集群控件&#xff0c;顾名思义它是一个类似于C语言的结构体的一个数据结构控件。在描述一个对象的时候&#xff0c;…