链表删除相关算法题|删除值为x的节点|删除最小值节点|删除值在区间内的节点|删除重复节点|删除绝对值相等的节点(C)

删除值为x的节点

在带头结点的单链表L中,删除所有值为X的结点,并释放其空间,假设值为×的结点不唯一

算法思想

删除单链表的节点需要三个指针
一个是遍历链表的工作指针cur,一个是指向cur的上一个节点的指针prev,一个是用于指向要删除的节点的指针del
![[Pasted image 20241102124337.png]]

prev指针指向头节点,cur指向第一个节点,开始遍历链表,直到cur指向空
如果没有碰到值为x的节点,将prev指向cur,cur指向cur的next,两个指针往后遍历
![[Pasted image 20241102124535.png]]

如果碰到值为x的节点,用del指向这个要删除的节点,cur指针指向下一个节点
![[Pasted image 20241102124723.png]]

prev的next指向cur,断开链表的连接
![[Pasted image 20241102124750.png]]

最后free掉del指向的节点
![[Pasted image 20241102124812.png]]

void DelX(LinkList &L, ElemType x)
{LNode* cur = L->next, *prev = L, *del;while (cur){if (cur->data == x){del = cur;cur = cur->next;prev->next = cur;free(del);}else{prev = cur;cur = cur->next;}}
}
思路2

采用尾插法建立单链表
用cur指针扫描L的所有节点,当其值不为x时,将其链接到L之后,否则将其释放
![[Pasted image 20241102125609.png]]

tail指向L头节点,cur指向第一个节点
如果cur指针遇到值不为x的节点,需要将其尾插到L后面,用tail指针的next指向cur,链接到tail后面;再把tail指针指向cur,也就是tail指针要指向新链表的最后一个节点;最后cur指向cur的next,继续向后遍历
![[Pasted image 20241102125913.png]]

如果cur遇到值为x的节点
用del指针指向要删除的节点,cur指向下一个节点
![[Pasted image 20241102130045.png]]

删除del指向的节点
![[Pasted image 20241102130104.png]]

最后将tail的next指向NULL
![[Pasted image 20241102130142.png]]

void DelX(LinkList &L, ElemType x)
{LNode* cur = L->next, *tail = L, *del;while (cur){if (cur->data != x){tail->next = cur;tail = cur;cur = cur->next;}else{del = cur;cur = cur->next;free(del);}}tail->next = NULL;
}

删除最小值节点

在带头结点的单链表L中删除一个最小值结点(假设该结点唯一)。

算法思想

需要一个工作指针cur来扫描整个链表,用前驱指针prev来保存cur的前一个节点
用mcur来保存最小值节点, mprev来保存最小值节点的前驱
首先prev指向cur,cur指向cur的next,正常往后遍历
如果cur指向节点的值小于mcur的值,将mcur指向cur,mprev指向prev
全部遍历完后,mprev的next指向mcur的next,断开mcur的链接,删除mcur指向的节点

void DelMin(LinkList &L)
{LNode* cur = L->next, *prev = L;LNode* mprev = prev, *mcur = cur;while (cur){if (cur->data < mcur->data){mcur = cur;mprev = prev;}prev = cur;cur = cur->next;}mprev->next = mcur->next;free(mcur);
}

删除值在区间内的节点

设在一个带表头结点的单链表中,所有结点的元素值无序,删除表中所有介于给定的两个值(作为函数参数给出)之间的元素(若存在)

算法思想

因为链表是无序的,只能逐个节点检查
需要一个工作指针cur指向第一个节点,一个前驱指针prev,指向头节点
cur一直往后遍历,直到cur指向NULL
prev指向cur,cur指向cur的next,往后遍历
如果cur的data在min和max之间,prev的next指向cur的next,删除cur指向的节点,cur指向prev的next

void RangeDel(LinkList &L, int min, int max)
{LNode* cur = L->next, *prev = L;while (cur){if (cur->data > min && cur->data < max){prev->next = cur->next;free(cur);cur = prev->next;}else{prev = cur;cur = cur->next;}}
}

删除重复节点

在一个递增有序的单链表中,存在重复的元素。删除重复的元素

算法思想

由于是有序链表,所有相同的值的节点都是相邻的,用cur扫描递增单链表L
用next指针指向cur的下一个节点,如果next节点的值等于cur节点的值,删除next节点,否则cur继续往后遍历

void DelSame(LinkList &L)
{LNode* cur = L->next, *next;if (cur == NULL)return;while (cur->next){next = cur->next;if (next->data == cur->data){cur->next = next->next;free(next);}elsecur = cur->next;}
}

删除绝对值相等的节点

【2015统考真题】用单链表保存m个整数,,且 ∣ d a t a ∣ ≤ n |data|≤ n datan(n为正整数)
对于链表中data的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。

算法思想

使用辅助数组记录链表中已经出现的数值,从而只需要对链表进行一次扫描
应为data的绝对值小于等于n,所以辅助数组的大小为n+1,各元素的初值均为0。依次扫描链表中的各个节点,同时检查数组中的值,若为0,就保留该节点,并令数组中该值绝对值的位置等于1,否则将该节点从链表中删除

void func(LinkList &L, int n)
{LNode* cur = L->next, del;int *a, m;a = (int*)malloc(sizeof(int)*(n+1));for(int i = 0; i < n + 1; i++){*(a+i) = 0;}while (cur->next){m = cur->next->data > 0 ? cur->next->data : -cur->next->data;if (*(a + m) == 0){*(a + m) = 1;cur = cur->next;}else{del = cur->next;cur->next = del->next;free(del);}}free(a);
}

需要一个工作指针cur来遍历链表,一个指针del用来指向要删除的节点
malloc一个数组,大小是n+1,并将数组中的值都置为0
开始遍历数组,直到cur->next指向NULL
用m来存放cur的下一个节点的data的绝对值
判断数组中m位置的值,如果是0,将其置为1,继续往后遍历
如果不是0
用del指向cur的下一个节点,将cur的next指向del的next,断开del的链接
删除del
最后删除数组a

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

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

相关文章

C++:哈希表的实现

一、哈希表的基本概念 1、负载因子&#xff1a;假设哈希表中已经映射存储了N个值&#xff0c;哈希表的大小为M&#xff0c;那么负载因子 N / M&#xff0c;负载因子有些地⽅也翻译为载荷因子/装载因子等&#xff0c;他的英文为load/factor。负载因子越大&#xff0c;哈希冲突的…

2024年11月软考考前注意事项

一、重要时间节点 准考证打印时间&#xff1a; 大部分省市的准考证打印时间从11月4日起开始&#xff0c;但上海、甘肃等地区则稍晚&#xff0c;从11月6日起开放打印。 请务必注意所在地区的具体打印时间&#xff0c;并尽早打印准考证&#xff0c;以免因错过时间而影响考试。…

书生大模型实战营Linux+InternStudio 关卡任务

一、端口映射 使用以下命令进行端口映射 ssh -p {YOUR_PORT} rootssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyCheckingno 命令解释&#xff1a; -p 37367&#xff1a;是指定 SSH 连接的端口为 37367。rootssh.intern-ai.org.cn&#xff1a;表示要以…

道品科技智能水肥一体化技术要点及实施效果

## 一、引言 水肥一体化技术是现代农业中一种重要的耕作方式&#xff0c;旨在通过合理配置水资源与肥料&#xff0c;提高作物产量和质量&#xff0c;达到节水、增效和环保的目的。随着全球人口的增加和耕地资源的减少&#xff0c;水肥一体化技术在农业生产中的应用愈加重要。 …

sqlserver使用bak文件恢复数据库

进入数据库 sqlcmd -S localhost -U SA -P password备份文件 #备份格式BACKUP DATABASE your_database_name TO DISK path_to_backup_file.bak;#举例 1> BACKUP DATABASE XJZDataTest TO DISK /root/mssql.bak; 2> go使用备份文件恢复数据库 1、查询备份文件中的数据…

CSP/信奥赛C++刷题训练:经典深搜例题(1):洛谷1605 :迷宫

CSP/信奥赛C刷题训练&#xff1a;经典深搜例题&#xff08;1&#xff09;&#xff1a;洛谷1605 &#xff1a;迷宫 题目描述 给定一个 N M N \times M NM 方格的迷宫&#xff0c;迷宫里有 T T T 处障碍&#xff0c;障碍处不可通过。 在迷宫中移动有上下左右四种方式&#x…

yolov8涨点系列之Concat模块改进

文章目录 Concat模块修改步骤(1) BiFPN_Concat3模块编辑(2)在__init_.pyconv.py中声明&#xff08;3&#xff09;在task.py中声明yolov8引入BiFPN_Concat3模块yolov8.yamlyolov8.yaml引入C2f_up模块 在YOLOv8中&#xff0c; concat模块主要用于将多个特征图连接在一起。其具体…

越权访问漏洞

V2Board Admin.php 越权访问漏洞 ## 漏洞描述 V2board面板 Admin.php 存在越权访问漏洞&#xff0c;由于部分鉴权代码于v1.6.1版本进行了修改&#xff0c;鉴权方式变为从Redis中获取缓存判定是否存在可以调用… V2Board Admin.php 越权访问漏洞 漏洞描述 V2board面板 Admin.ph…

安装和运行开发微信小程序

下载HBuilder uniapp官网 uni-app官网 微信开发者工具 安装 微信小程序 微信小程序 官网 微信小程序 配置 运行 注意&#xff1a;运行前需要开启服务端口 如果运行看不到效果&#xff0c;设置下基础库选别的版本 配置

小檗碱和卤代苄基异喹啉生物碱的代谢工程合成-文献精读79

De novo biosynthesis of berberine and halogenated benzylisoquinoline alkaloids in Saccharomyces cerevisiae 在 酿酒酵母&#xff08;Saccharomyces cerevisiae&#xff09;中从头合成小檗碱和卤代苄基异喹啉生物碱 小檗碱的酵母代谢工程生物合成-文献精读78 苄基异喹…

鸿蒙开发案例:七巧板

【1】引言&#xff08;完整代码在最后面&#xff09; 本文介绍的拖动七巧板游戏是一个简单的益智游戏&#xff0c;用户可以通过拖动和旋转不同形状的七巧板块来完成拼图任务。整个游戏使用鸿蒙Next框架开发&#xff0c;利用其强大的UI构建能力和数据响应机制&#xff0c;实现了…

【TS】九天学会TS语法——1.TypeScript 是什么

今天学习的是TypeScript 基础&#xff0c;目标是了解 TypeScript 的基本概念&#xff0c;安装 TypeScript&#xff0c;编写第一个 TypeScript 程序。 TypeScript 简介安装 TypeScriptTypeScript 编译过程编写第一个 TypeScript 程序 随着前端开发的不断发展&#xff0c;TypeScr…

Docker学习—Docker的安装与使用

Docker安装 1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2.配置Docker的yum库 首先…

69.ov5640摄像头HDMI灰度显示

&#xff08;1&#xff09;理论学习 灰度像素&#xff1a;在 RGB 颜色模型下&#xff0c;图像中每个像素颜色的 R、G、B 三种基色的分量值相等的像素。由灰度像素组成的灰度图像只能表现256中颜色&#xff08;或亮度&#xff09;&#xff0c;通常把灰度图像中像素的亮度称为灰…

Star Tower:开启数据存储新纪元

在科技飞速发展的当今时代&#xff0c;数据如同璀璨的星辰&#xff0c;闪耀着无尽的价值。而数据存储系统&#xff0c;则是承载这些星辰的浩瀚宇宙。Star Tower 以其卓越的性能和创新的理念&#xff0c;开启了数据存储的新纪元。 Star Tower 的分布式存储架构&#xff0c;是一…

基于SSM的企业管理系统(源码+lw+调试+技术指导)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

鸿蒙应用App测试-通用测试

注意&#xff1a;大家记得学完通用测试记得再学鸿蒙专项测试 鸿蒙应用App测试-专项测试&#xff08;DevEco Testing&#xff09;-CSDN博客 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得…

掌握Qt调试技术

文章目录 前言一、Qt调试的基本概念二、Qt调试工具三、Qt调试实践四、Q调试技巧五、总结前言 在软件开发中,调试是一个至关重要的环节。Qt作为一个广泛使用的跨平台C++图形用户界面应用程序开发框架,其调试技术也显得尤为重要。本文将深入探讨Qt调试技术,帮助读者更好地掌握…

Qt中时间戳转化为时间

QT中时间和时间戳互相转化_currentsecssinceepoch-CSDN博客 qDebug()<<QDateTime::currentMSecsSinceEpoch(); 1730838034770 时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu) [static] qint64 QDateTime::currentMSecsSinceEpoch() Returns the number of milli…

势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾

2024年11月01日&#xff0c;由生信科技举办的SOLIDWORKS 2025新产品发布会在江苏苏州圆满落幕。现场邀请到制造业的专家学者们一同感受SOLIDWORKS 2025最新功能&#xff0c;探索制造业数字化转型之路。 在苏州站活动开场&#xff0c;达索系统专业客户事业部华东区渠道经理马腾飞…