[算法浅析] 如何在O(1)的时间里删除单链表的结点
来源:互联网 发布:南京市网络问政平台 编辑:程序博客网 时间:2024/06/06 08:33
题目是这样的:给你一个单链表的表头,再给你其中某个结点的指针,要你删除这个结点,条件是你的程序必须在O(1)的时间内完成删除。
由于有的同学对链表还不是很熟悉,本文尽量描述的通俗易懂,老鸟请直接跳过前面一大段。
链表结构如下:
题目不是很难,很快就能想到好办法:)
首先回顾一下普通的删除方法,首先通过表头,找到待删除结点(设为B)的前一个结点(设为A),将A的指向改一下就行,然后删除掉B结点就行了。要删除的结点一定要delete掉,这不仅是个好习惯,而且能避免将来项目中可能造成的内存泄露的严重问题。
这个算法主要耗时在于查找前一个结点,所以是O(n)的算法。
那么既然要求是O(1),显然不能再去for一遍了,联想到数组的删除,这个问题就比较好解决了。
首先我们很容易就能得到待删除结点,即B结点的后一个结点C,然后将C的值赋值给B结点的值,相当于数组删除时候的覆盖,现在B结点和C结点一模一样了,接下来就相当简单了吧,我们不删B,直接利用B删掉C就行了,方法简单,时间O(1)。
但是仔细想想这个算法有个很明显的缺陷,如果待删除结点是最后一个结点呢?这个时候似乎没有什么好的解决办法,只能老老实实的O(n)了。现在我们来看看平均时间复杂度:
符合题目要求。
最后附上完整测试代码:
0 0
- [算法浅析] 如何在O(1)的时间里删除单链表的结点
- [算法浅析] 如何在O(1)的时间里删除单链表的结点
- 如何在O(1)的时间里删除单链表的结点
- 算法-O(1)时间删除链表的指定结点
- 在O(1)时间删除单链表结点
- 在O(1)时间删除链表的结点
- 【36】在O(1)的时间删除链表结点
- 在O(1)的时间删除链表结点
- 剑指offer算法题之单链表的删除结点操作--面试题13:在O(1)时间删除链表结点
- 在 O(1) 的时间内删除单链表的结点
- 面试题13:在O(1)时间删除单链表结点
- 剑指offer 3.3 代码的完整性3- 在O(1)时间删除链表结点
- 面试题13 在o(1)时间删除链表的给定结点
- 面试题13:在O(1)的时间删除链表结点
- 剑指Offer面试题13[在O(1)时间删除表的结点]
- 给定链表的头指针和一个结点指针,在O(1) 时间删除该结点
- 给定链表的头指针和一个结点指针,在O(1) 时间删除该结点
- 给定链表的头指针和一个结点指针,在O(1)时间删除该结点
- 活着(一)
- 多行图片hover加边框兼容IE7+
- NSString NSMutableString NSArray NSMutableArray copy和mutablecopy方法
- fork与vfork
- hdu 1097 2014731 A Hard Puzzle
- [算法浅析] 如何在O(1)的时间里删除单链表的结点
- 推测Oracle GoldenGate(OGG)目的端 rep进程Checkpoint Lag的计算方法
- hello world
- 微信的尚方宝剑——互联网闭环
- PHP 5.3.0以上推荐使用mysqlnd驱动
- 【iOS开发技术】对象关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
- 数星星~
- 对spark和scala的进一步学习
- 谷歌浏览器如何设置为无图模式