链表中删除选定结点的优雅操作!

一般我们在进行单向链表链表的结点删除操作时,都是通过相应的结构体指针进行链表的遍历,然后找

到需要删除的节点,为了完成删除操作,我们需要在寻找该节点时,不断地记录下这个节点前面的节点

(prev),来保证当特定结点被删除后,我们还可以将断开的链表重新连起来,下面给出一段伪码:


remove_list_entry(entry){prev = NULL;walk = head;// Walk the listwhile (walk != entry){prev = walk;walk = walk -> next;}
// Remove the entry by updating the // head or the previous entryif (!prev)head = entry->next;elseprev->next = entry->next;
}

原理如下图

在这里插入图片描述
(该段代码没有考虑待删除节点不在链表中的情况)

另外,这段代码还考虑到一个特殊情况,待删除的节点不是中间节点,而是头结点(head).而这段代码也是大多数学校的老师或者是书上教我们的.

然而,下面的代码也可以完成同样的功能(伪码):

remove_list_entry(entry){// The "indirect" pointer points to the // *address* of the thing we'll updateindirect = &head;// Walk the list, looking for the thing that// poins to the entry we want to remove_list_entrywhile ((*indirect) != entry){indirect = &((*indirect)->next);}// .. and just remove it*indirect = entry -> next;}

看到这段代码我觉得大多数人的第一印象就是很简洁,很骚(帅),没有if-else,不管我们需要删除的头结点还是中间节点,都可以用相同的逻辑来表达.

而这段代码使用的就是我们不经常使用的指针的指针,同过它,消除了if-else,消除了previous,使代码变得更优雅,我喜欢这个词/cy

关键点就是indirect这个指针第一次指向的是head的地址,第二次指向的是节点1.next的地址,第三次指向的是节点2.next的地址.

通过比较,可以知道第一段代码并不好,它需要第一个节点和中间节点,有特例.

而第二段代码展示了一种不同的方式,可以把一个特例当成正常情况来处理,这就是好的代码,优雅的代码.

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

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

相关文章

python抢货程序_Python自动化xpath实现自动抢票抢货代码示例

本篇文章小编给大家分享一下Python自动化xpath实现自动抢票抢货代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。 总代码: for i in range(51,56): driver.imp…

Ubuntu安装pycharm并且激活

下载pycharm: https://www.jetbrains.com/pycharm/download/#sectionlinux 选择专业版下载,然后提取,也就是解压 进入解压后目录,再进入bin目录,打开终端执行命令 ./pycharm.sh pycharm就启动了 激活Pycharm: 编辑hosts文件&am…

二阶矩阵转置怎么求_矩阵求导术(下)

点击上方“Datawhale”,选择“星标”公众号第一时间获取价值内容本文承接上篇 https://zhuanlan.zhihu.com/p/24709748,来讲矩阵对矩阵的求导术。使用小写字母x表示标量,粗体小写字母表示列向量,大写字母X表示矩阵。矩阵对矩阵的求…

c语言中x的n次方怎么表示_线性代数的本质及其在人工智能中的应用

线性代数是 AI 专家必须掌握的知识,这已不再是个秘密。如果不掌握应用数学这个领域,你永远就只能是「门外汉」。当然,学习线性代数道阻且长。数学,尤其是线性代数常与枯燥、复杂和毫无意义的事物联系起来。不过你还可以另辟蹊径。…

django 实现电子支付功能

思路:调用第三方支付 API 接口实现支付功能。本来想用支付宝来实现第三方网站的支付功能的,但是在实际操作中发现支付宝没有 Python 接口,网上虽然有他人二次封装的的 Python 接口,但是对我这个小白白来说上手还是有点难度&#x…

android中怎么保存checkbox中的checked属性_第二十四天HTML中的form表单

form表单用于收集用户信息,如:登录、注册等场景;所有要提交的数据都必须放在form标签中action:提交地址、动作,与input标签中typy标签的submit属性相关联。 ,提交地址是action的地址method:提交方法&#x…

Python中曲率与弯曲的转换_1000R曲率更具沉浸感!三星T55曲面显示器评测

在曲面屏的设计上,三星一直在突破极限,比如在2017年推出的49英寸超宽带鱼屏C49HG90,引来众人围观,非常震撼。而在曲率方面,我们常见的有1800R和1500R,但是三星并不满足,于日前推出了一款曲率达到…

opencv resize_opencv-python库基础操作(一)

点赞再看,养成习惯!点赞再看,养成习惯!点赞再看,养成习惯!opencv-python库基础操作0.安装opencv-pythonpip install opencv-python进行下载并安装不过在python中导入opencv库的时候需要"import cv2&qu…

百旺智能编码_【百旺】票字版开票软件操作指南已为您备好,请查阅!

为确保小规模纳税人继续享受税收优惠政策,请广大用户及时对开票软件进行升级~按照国家税务总局要求,从增值税发票税控开票软件五月补丁开始,将停止对增值税发票税控开票软件(税控盘版)“税”字版(以下简称“税”字版)的软件升级更新服务&…

mysql binlog 备份_做好mysql运维,必须熟练掌握备份和恢复,实战一次不行多来几次...

原文:https://www.toutiao.com/i6855460778359816715/平台:头条作者:程序员不就是0和1一、 备份恢复策略进行备份或恢复操作时需要考虑一些因素:1、确定要备份的表的存储引擎是事务型还是非事务型,两种不同的存储引擎备…

在过程中要正式批准可交付成果_干货!软考高项项目管理知识体系5大过程组47个过程...

现在应该很多小伙伴都在紧张的复习软考中,为了让大家更加高效的复习,今天给大家分享软考高级信息系统项目管理师的考试重点,项目管理知识体系的5大过程组47个过程。考高项的朋友都知道,47个过程是非常重要的,必须要理解…

android 组件化_Android 组件化路由框架设计(仿Arouter)

前言在组件化开发中一个必须要面对的问题就是组件间页面跳转,实现的方法有很多,简单的可以通过反射获取,但是比较耗费性能,也可以通过隐式跳转,但是随着页面的增多,过滤条件会随之增多,后期维护…

1668智能下数教程视频_你需要的教程合集更新

最近又收集了一波网络安全资源,在文章最底部。花了将近一天时间整理,只求各位小哥哥能点个在看,分享给身边的朋友。网络安全 --职业发展(渗透的最底部)2019网络安全初识与职业发展https://pan.baidu.com/s/1CAzO8IWxzBj-bOZlJ2eFVg 提取码&am…

关于java中nextline读取空白行的问题

最近在做java作业, 发现了一个问题, 就是nextline其实会接收缓冲区的\r, 使得在程序运行时nextline像是跳过了一样, 其实不然, 它只是读取了上一个enter时的\r, 如我的如下功能代码 public void run() {Scanner scan new Scanner(System.in);int ord, book_order;int flag 0;…

推荐系统——协同过滤

协同过滤 协同过滤算法一般是通过用户之前的喜好或者相似的用户的喜好来推荐商品 基于领域的协同过滤算法一般有两种算法: 基于用户的协同过滤算法(UserCF):基于与用户相似用户的喜好进行推荐基于物品的协同过滤算法(ItemCF):基于用户喜好的物品寻找相似的物品进…

电感检测_几种常用的电流检测方式

RT1720 是一款最高输入电压可达 80V、输出电压可达 60V 的热插拔控制器,它的作用是防止系统受到过高电压和负电压的攻击,同时还能防范过电流可能导致的问题,它的一种应用电路大致如下图所示:为了检测负载电流的大小,RS…

推荐系统——矩阵分解FM

矩阵分解 隐语义模型与矩阵分解 之所以我们提出隐语义模型与矩阵分解,原因就是[[协同过滤]]存在泛化能力弱的问题 而对于隐语义模型而言,我们可以利用隐向量来代表隐藏信息 此外,也可以在一定程度上弥补[[协同过滤]]处理稀疏矩阵能力不足的…

千位分隔符的完整攻略

千位分隔符[1]是很常见的需求,但是输入文本千变万化,如何才能准确添加千分符呢? 纯整数情况 纯整数大概是所有情况里最简单的一种,我们只要正确匹配出千分位就好了。 观察上面的数字,我们可以得出千分位的特征是到字符…

限制按钮点击_Android | 使用 AspectJ 限制按钮快速点击

前言在Android开发中,限制按钮快速点击(按钮防抖)是一个常见的需求;在这篇文章里,我将介绍一种使用AspectJ的方法,基于注解处理器 & 运行时注解反射的原理。如果能帮上忙,请务必点赞加关注&…

svn不知道这样的主机 怎么解决_家里装修不知道怎么配置净水器,这几招教你轻松解决...

为了保障家庭饮水健康,很多业主都会选择在家中安装一台厨下净水器。但是,如若仅靠它来满足全家人日常洗漱,沐浴和饮用,这势必会极大地影响到全家人的生活品质。这个时候,实阳机电良心建议,全屋净水系统&…