移除链表元素题目讲解

一:题目

二:思路讲解 

方法一:

1:创建两个指针prev和cur,初识位置cur为head,prev为NULL,然后两个指针往后移动开始去寻找与val值吻合的节点,最后找到节点的时候,cur指向该节点,prev指向该节点的前一个节点,现在我们的目的是要删除这个cur指向的节点,让cur去指向该节点的下一个节点!

2:所以我们先将prev的next修改为该节点的下一个节点,将该节点的前后两点链接起来(prev->next = cur ->next)然后再让cur指向该节点的后一个节点(cur=prev->next )。

第一步:初始状态:

第二步:找到val值吻合的时候:

第三步: 先将prev的next修改为该节点的下一个节点,将该节点的前后两点链接起来(prev->next = cur ->next)

第四步: 然后再让cur指向该节点的后一个节点(cur=prev->next )。

这样就成功的删除了一个与val值吻合节点。

如果你疑问为什么不直接cur=cur->next,也就是直接让cur指向了该节点的下一个节点,那是因为我们需要释放掉该节点。而该节点是cur指向的,我们free(cur)的这一步,是放在第三步和第四步之间,free(cur)不会产生任何影响,如果直接cur=cur->next,那不管是在这一步之前还是之后free(cur),都会对cur产生影响,从而导致答案错误。

特殊情况:第一个或者前几个一直val值都吻合

第一步:初始状态:

这种情况,我们对prev的操作,会变成对空指针的解引用,这是错误的!

解决方法:寻找一个新的头,也就是让上面的链表变成下面:

这样又可以按照之前的方法做下去了。

代码展示:

由图可知: 判断特殊情况的if有两种写法,皆可。

方法二:

遍历原链表,把不是val的节点尾插到新链表。

1:首先需要一个cur初始为head,一个newhead(NULL),一个tail(NULL)来保存节点去进行尾插,这两个一开始都是NULL,因为可能链表是一个空链表,这样直接返回newhead就好。

2:发现与val值吻合的节点,先用一个指针del去保存这个节点,然后直接让cur指向该节点的下一个节点,然后free掉该节点,(free(del))。

3:发现与val值 不 吻合的节点,就进行尾插,尾插有两种情况,一种是第一次尾插,一种是不是第一次尾插。

第一次尾插:tail为null,要将cur赋值给newhead和tail,赋值给newhead就让其指向了第一个尾插的节点,这样newhead就是新链表的头指针了,赋值给tail是因为,tail要指向新链表的尾节点,tail会与cur进行新的尾节点的插入等工作。

不是第一次尾插:即tail不为null,先尾插,让tail指向的节点去链接到新的尾插节点(tail->next=cur),再移动tail,再让tail去指向新的尾插节点(tail=tail->next)。

第一步:发现val值吻合的节点,先用一个指针del去保存这个节点,然后直接让cur指向该节点的下一个节点,然后free掉该节点,(free(del))。

第二步:发现与val值 不 吻合的节点的第一次尾插

tail为null,要将cur赋值给newhead和tail

第三步:不是第一次的尾插

即tail不为null,先尾插,让tail指向的节点去链接到新的尾插节点(tail->next=cur)

再移动tail,再让tail去指向新的尾插节点(tail=tail->next)。 

代码展示: 

注意:

尾插的最后一个节点的next没有置空,所以我们在最后将tail->next=NULL,但是在这之前,我们得先判断tail是否为空,因为可能这个链表是个空链表或者全为val,这样才能避免对tail(NULL)的解引用。这一步不能在尾插的else里面进行,因为下一次的尾节点的插入会需要对tail进行解引用,这样会造成对NULL 的解引用!  所以在新链表完全形成之后,再去进行最为正确!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础之yum和vim

目录 一、软件包管理器yum 1.1 软件包的概念 1.2 软件包的查看 1.3 软件包的安装和删除 二、Linux编辑器之vim 2.1 vim的基本概念 2.2 正常模式(命令模式) 2.3 底行模式 2.4 输入模式 2.5 替换模式 2.6 视图模式 2.7 总结 一、软件包管理器yu…

SSL证书0元购完整教程

为了确保在线交互的安全性与可信度,越来越多的网站选择启用SSL(Secure Sockets Layer)证书,为数据传输加上一层坚实的保护罩。尤为值得一提的是,随着技术的发展与行业推动,免费SSL证书逐渐成为众多网站所有…

秒翻-网页翻译最佳选择

使用方法: 安装“沉浸式翻译” 在扩展设置页面勾选“Beta”特性。 输入 DeepLX 现成的 API-https://api.deeplx.org/translate。

【Git】Commit后进行事务回滚

起因 因为一直使用git add .,在学习pytorch中添加了一个较大的数据集后,导致git push失败,而这个大数据集并不是必须要上传到仓库的,但是因为自己在设置.gitignore前已经进行了git comit,所以,需要进行事务…

C#中实现DataGridView数据的优雅Excel之旅(EPPlus)

DataGridView效果图: EXCEL效果图: 代码如下: 首先要引入EPPlus包 可以使用命令行来安装 Install-Package EPPlus 也可以使用NUGet搜索EPPlus来安装 public Homes(){InitializeComponent();ExcelPackage.LicenseContext OfficeOpenXml.LicenseContext…

机器学习:人工智能中实现自动化决策与精细优化的核心驱动力

🔒文章目录: 💥1.概述 ❤️2.机器学习基本原理 🛤️2.1定义与关键概念 🛣️2.2 机器学习算法 ☔3.自动化决策中的机器学习应用 🚲4.精细优化与机器学习的结合 👊5.挑战与前景 💥1.概述 …

2024年学浪课程下载工具

学浪下载工具我已经打包好了,有需要的自己下载一下 学浪下载器链接:百度网盘 请输入提取码 提取码:1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.打开解压好的文件夹里面的N_m3u8D文件夹,然…

世界上最好用的在线看板工具 Trello 已支持 AI 啦!

对 Trello 免费版用户的提醒 从5月20日开始,免费版 Trello 工作区仅支持 10 个协作者,超过此限制将仅支持查看,无法编辑。解决这一问题的方法是减少协作者数量或升级到标准版或高级版。 Atlassian 去年在其云平台中引入了人工智能工具 Atlas…

TikTok营销策略解析:7大关键要素打造品牌影响力

TikTok作为近年来迅速崛起的短视频社交平台,已经成为全球范围内品牌营销的重要阵地。对于品牌而言,如何在TikTok上有效地开展营销活动,吸引目标受众的注意力,提升品牌知名度和影响力,是摆在他们面前的重要课题。本文No…

Tcl学习笔记(四)——流程控制、过程、命名空间、访问文件

1. 流程控制 if命令 if命令后跟两个参数:表达式、待执行的Tcl脚本。if命令中的每一个左大括号都必须与它前一个字符同行。 有elseif和else可选子句,使用时与if中第二个参数的右大括号放在同一行。 switch命令 switch命令利用一个给定值与多个模式进行匹…

Redis-五大数据类型-Hash(哈希)

五大数据类型-Hash(哈希) 简介 Hash是一个键值对的集合。 Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。 Hash 是 Redis 中出现最为频繁的复合…

大模型市场爆发式增长,但生成式AI成功的关键是什么?

进入2024年,大模型市场正在爆发式增长。根据相关媒体的总结,2024年1-4 月被统计到的大模型相关中标金额已经达到2023年全部中标项目披露金额的77%左右;其中,从项目数量来看,应用类占63%、算力类占21%、大模型类占13%、…

OpenCV 入门(六) —— Android 下的人脸识别

OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门&#xf…

如何查看打包后的jar包启动方法

背景 有时候我们在引用一个jar包的时候,想查看一个jar包的结构,这时候查看启动类就比较重要,因为一些关键配置是在启动类上的,这里教大家如何查看这个启动类(springboot项目) 步骤 首先打开jar包预览结构,可以使用解压缩工具直接双击打开或者预览结构 打开路径 META-INF/MA…

遥感+大数据为智慧无人农场按下“倍速键”

春回大地万象“耕”新,在襄阳市襄州区张家集镇近2000亩小麦绿意盎然、勃勃生机。 湖北绿神农业科技有限公司的生产经理王真指着监控室的电脑屏幕,告诉记者在与珈和科技合作开发的农田遥感监测平台上各类农田数据一目了然,为实现农业智能化管理…

TriCore User Manual 笔记 1

说明 本文是 英飞凌 架构文档 TriCore TC162P core archiecture Volume 1 of 2 (infineon.com) 的笔记,稍作整理方便查阅,错误之处,还请指正,谢谢 :) 1. Architecture 2. General Purpose & System Register 名词列表&#…

记录一个RSA加密js逆向

network调试就不说了吧 pwd加密参数 搜索pwd参数定位逆向 可以看到有很多关键词 但是我们细心的朋友会发现加密函数关键字 encrypte 打上断点 调试 发现在断点处停止了 并且框选函数发现了一串加密值 虽然不一样但是大概率是这个 并且没你每次放置移开都会刷新 所以如果这个就是…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-14-主频和时钟配置

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

2024上半年软考新规,对高级论文科目不太友好

辽宁省发布了《关于2024年上半年计算机技术与软件专业技术资格(水平)考试批次安排的通知》,通知原文如下: 添加图片注释,不超过 140 字(可选) 添加图片注释,不超过 140 字(可选) 1.…

群晖上部署农场管理系统farmOS

什么是 farmOS ? farmOS 是一个基于 Web 的应用程序,用于农场管理、规划和记录保存。它由志愿者社区开发,旨在为农民、开发人员和研究人员提供一个标准平台。 需要注意的是,群晖内核版本太低会遇到下面的错误,这个 AH0…