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

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

(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的地址.

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

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

链表中删除选定结点的优雅操作!相关推荐

  1. 【Java】牛客网 删除链表中重复的结点

    题目描述 : 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表 1->2->3->3->4->4->5 ...

  2. 剑指offer之删除链表中重复的结点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  3. 剑指offer——面试题57:删除链表中重复的结点

    剑指offer--面试题57:删除链表中重复的结点 Solution1: 删两遍,自己想的破算法.理论上时间复杂度也是O(n)O(n)O(n),并非最优解. /* struct ListNode {i ...

  4. 【算法】剑指offer - JZ76 删除链表中重复的结点

    题目链接 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 分析 1.确定去重的范围,采用 前开后闭 的方法. 2.增加一个头结点,统一操作. (pre ...

  5. 无头结点单链表的逆置_从无头单链表中删除节点及单链表的逆置

    题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点).请将该节点从单链表中删除. 解答: 典型的"狸猫换太子", 若要删除该 ...

  6. 剑指offer:删除链表中重复的结点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  7. 剑指Offer(Java实现)删除链表中重复的结点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  8. 删除链表中重复的结点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.例如,链表1->2->3->3->4->4->5 处理后为 ...

  9. 剑指offer:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1-& ...

最新文章

  1. python2.7除法_对python中的float除法和整除法的实例详解
  2. 如何把2d目标检测的bbox转化到现实世界坐标系的?
  3. [转]Docker学习之四:使用docker安装mysql
  4. 搭建SpringBoot、Jsp支持学习笔记
  5. Markdown 语法及常用资料收集--CheatSheet
  6. 微软中国发布“IE8浏览器性能解密”,为金山网盾辟谣
  7. Java数据结构和算法(四)——栈
  8. python刷b站教程_python + selenium 刷B站播放量的实例代码
  9. maccms V10后门
  10. 关于socket组播和ssdp(一)[修改1.2]
  11. 【操作系统】存储器管理01-思维导图
  12. 俄罗斯一款地图软件无意曝光300多个军事基地
  13. freemarker制作word模板
  14. 统计学——线性回归决定系数R2
  15. 订单导出(淘宝天猫)
  16. 赛博哈希CyberHash顺势而为,获数千万美金的融资
  17. #Objective - C - UI-design - 第六天 -UIKit框架-UIScrollView-分屏相册练习(相册缩略图变为浏览到第几张)
  18. Google 不想与甲骨文争了,要放弃 Java APIs
  19. 希尔伯特到解析信号,再到复包络
  20. Jan. 1, 2020 at 7:47 a.m. GMT+8遇到这种时间,转换成中国标准时间

热门文章

  1. Java程序练习-螺旋矩阵
  2. 男生给女生最牛B的告白
  3. Postgresql时间处理
  4. 多种时间格式字符串转换为Date对象
  5. SQL中及Access的空值
  6. java web的动静分离_Apache结合Tomcat实现动静分离的方法
  7. easyui下拉框option写死_JavaScript_jQuery+easyui中的combobox实现下拉框特效,1.第一种写法:Input框中显示: - phpStudy...
  8. java基础面试题整理(BAT)
  9. mysql 正无穷字符_mysql 字符串函数收集比较全
  10. 什么是索引?索引类型有几种,各有什么特点?