用O(1)的时间复杂度删除单链表中的某个节点

用O(1)的时间复杂度删除单链表中的某个节点

给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:

struct ListNode
{int        m_nKey;ListNode*  m_pNext;
};

函数的声明如下:

void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);

这是一道广为流传的Google面试题,考察我们对链表的操作和时间复杂度的了解,咋一看这道题还想不出什么较好的解法,但人家把题出在这,肯定是有解法的。一般单链表删除某个节点,需要知道删除节点的前一个节点,则需要O(n)的遍历时间,显然常规思路是不行的。在仔细看题目,换一种思路,既然不能在O(1)得到删除节点的前一个元素,但我们可以轻松得到后一个元素,这样,我们何不把后一个元素赋值给待删除节点,这样也就相当于是删除了当前元素。可见,该方法可行,但如果待删除节点为最后一个节点,则不能按照以上思路,没有办法,只能按照常规方法遍历,时间复杂度为O(n),是不是不符合题目要求呢?可能很多人在这就会怀疑自己的思考,从而放弃这种思路,最后可能放弃这道题,这就是这道面试题有意思的地方,虽看简单,但是考察了大家的分析判断能力,是否拥有强大的心理,充分自信。其实我们分析一下,仍然是满足题目要求的,如果删除节点为前面的n-1个节点,则时间复杂度为O(1),只有删除节点为最后一个时,时间复杂度才为O(n),所以平均的时间复杂度为:(O(1) * (n-1) + O(n))/n = O(1);仍然为O(1).下面见代码:

复制代码
 1 /* Delete a node in a list with O(1)
 2  * input:    pListHead - the head of list
 3  *            pToBeDeleted - the node to be deleted
 4  */
 5 
 6 struct  ListNode  
 7 {
 8     int            m_nKey;
 9     ListNode*    m_pNext;
10 };
11 
12 void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted)
13 {
14     if (!pListHead || !pToBeDeleted)
15         return;
16     
17     if (pToBeDeleted->m_pNext != NULL) { 
18         ListNode *pNext = pToBeDeleted->m_pNext;
19         pToBeDeleted->m_pNext = pNext->m_pNext;
20         pToBeDeleted->m_nKey = pNext->m_nKey;
21 
22         delete pNext;
23         pNext = NULL;
24     }
25     else { //待删除节点为尾节点
26         ListNode *pTemp = pListHead;
27         while(pTemp->m_pNext != pToBeDeleted) 
28             pTemp = pTemp->m_pNext;
29         pTemp->m_pNext = NULL;
30 
31         delete pToBeDeleted;
32         pToBeDeleted = NULL;
33     }
34 }
转载自:http://www.cnblogs.com/bakari/p/4013812.html

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

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

相关文章

Django之序列化

关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。 1、serializers from django.core import serializersret models.BookType.objects.all()data serializers.serialize("json", ret)2、json…

linux c语言内核函数,2014-1-5_linux内核学习(1)_C语言基础

1、结构体的初始化static struct file_operations fops {.read device_read,.write device_write,.open device_open,.release device_release};以前学习C语言的时候没有见过struct的这种初始化方式。这其实是C语言的新标准。Struct一共有三种初始化的方式:int…

我的备忘录

http://jnesta.blogdriver.com/jnesta/index.html 转载于:https://www.cnblogs.com/oisiv/archive/2006/04/06/368663.html

怎么选工作?

选择offer,一直是很困难的事,工作不是餐桌上的美食,你品尝了这个菜还可以去尝那一道菜,所以大家都害怕因为选错一方而失去了更好的机会。而那句「选择大于努力」,让很多人更看重选择。我会经常遇到同学向我咨询offer选…

Selenium断言的使用,等待

自动化测试常用断言的使用方法(python) 自动化测试中寻找元素并进行操作,如果在元素好找的情况下,相信大家都可以较熟练地编写用例脚本了,但光进行操作可能还不够,有时候也需要对预期结果进行判断。 这里介…

oracle 表复制操作

如下&#xff0c;表a是数据库中以前存在的表&#xff0c;b是预备依据表a执行复制树立的表&#xff1a; 1、只复制表结构的sql create table b as select * from a where 1<>1 2、即复制表结构又复制表中数据的sql create table b as select * from a 3、复制表的制定字段…

linux系统运行iso,linux可以加载iso镜像文件到启动项吗

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼楼主的需求描述不清&#xff0c;不作评述。只说下关于楼上一些吧友提到的grub loopback设备可mount iso并读取其中文件的功能未读过grub1/2的源码&#xff0c;不太了解其实现原理&#xff0c;但从应用上来说&#xff0c;这个设备不…

ESFramework 可复用的通信框架(序)

自从2004年7月开始&#xff0c;就一直从事N层C/S结构的服务端的开发&#xff0c;从最初的熟悉各种Windows Socket API、熟悉完成端口模型&#xff0c;探索高效稳定的服务端通信模型&#xff0c;时至今日&#xff0c;慢慢的积累了一些C/S服务端开发的经验&#xff0c;ESFramewor…

为了兴趣爱好,我该选嵌入式么?

“绝对不要&#xff01;&#xff01;”“绝对不要&#xff01;&#xff01;”“绝对不要&#xff01;&#xff01;”喜欢听结论的同学们&#xff0c;我说的够清楚了吧&#xff1f;接下来&#xff0c;是为那些喜欢问“为什么”的小好奇们解答疑问的环节。为了让道理变得简单明了…

类中构造函数、析构函数与赋值函数的重写

类中构造函数、析构函数与赋值函数的重写 class String {public:String(const char *str NULL); // 普通构造函数String(const String &other); // 拷贝构造函数~String(void); // 析构函数String & operate(const String &other); // 赋值函数private:char *m_d…

Sublime Text3(mac)一些插件和快捷键

Sublime Text3&#xff08;mac&#xff09;一些插件和快捷键 楚简约 关注 2017.02.24 17:02* 字数 1216 阅读 412评论 0喜欢 2下载地址http://www.sublimetext.com/3一、安装Package Control按Ctrl 调出console&#xff0c;粘贴下列安装代码到底部命令行并回车&#xff1a; 重…

linux+内核+环形缓冲,环形缓冲区-模仿linux kfifo【转】

struct kfifo{uint8_t *buffer;uint32_t in; // 输入指针uint32_t out; // 输出指针uint32_t size; // 缓冲区大小&#xff0c;必须为2的次幂}/*判断n是否为2的幂*/static bool is_power_of_2(unsigned int n){return (n ! && ((n & (n - )) ));}/*将数字a向上取整…

【Project3】技术总结

1.quartz 百分百自己会用 2.转载于:https://www.cnblogs.com/mount/archive/2011/11/09/2243265.html

4-7月份规划

1.准备管理系统中计算机应该实践2.学习高等数学二及英语二3.学习VB.Net(估计公司会用VB.Net)&#xff0c;不过可以尽量争取C#4.和红哲讨论一下测试方法.5.对财务系统的测试,加强财务的能力6.购一本练习会计分录的习题集. 7.今后的发展方向&#xff0c;融投资管理 转载于:https:…

没去公司上班的这两天

这周得到通知是居家办公&#xff0c;但因为项目的事&#xff0c;前两天去了公司&#xff0c;今天情况特殊&#xff0c;我需要去合作的公司调试&#xff0c;就没去公司。早上还是9点起来&#xff0c;因为合作的公司离我家很近&#xff0c;可以多休息一会。但早早就睁开了眼&…

Activity的缓存方法

转载地址:http://blog.csdn.net/zhichu_2025/article/details/52047605 有a、b两个activity&#xff0c;当a进入b之后的一段时间&#xff0c;可能系统就把a回收了&#xff0c;这时候按back键&#xff0c;执行的不是a的onStart()方法&#xff0c;而是onCreate()方法&#xff0c…

c# datatable

DataTable dt new DataTable("cart"); //创建表dt.Columns.Add( new DataColumn("number", Type.GetType("System.String"))); //创建列 dt.Columns.Add( new DataColumn("qq", Type.GetType("System.String")));DataR…

linux pdm 查看工具,linux系统监控工具

通过系统监控可以了解系统的运行状态、及时发现异常、分析原因、提早解决&#xff0c;避免系统故障&#xff0c;确保用户对系统的感知度和满意度。IPTV系统一般是通过告警管理、日志管理、信令跟踪、探针、诊断测试来实现对系统的监控。小编为大家分享了linux系统监控工具&…

windows服务器下com6僵尸***删除

服务器被挂马&#xff0c;有一些可以被清除&#xff0c;有一个***被命名为com6.asp&#xff0c;无法被简单删除&#xff0c;网上baidu了一下&#xff0c;只能通过命令行的方式才能删掉&#xff0c;试了半天还是不可以&#xff0c;最后发现***文件还被设置成为了 RSH 属性&#…

USB抓包

安装的时候需要选上安装完之后&#xff0c;会提示让你重启电脑&#xff0c;如果不重启电脑的话也看不到USB的设备。之后可以通过usb.src来过滤自己想dump的设备信息当然&#xff0c;有一个技巧是&#xff0c;你可以先停止读写你的USB&#xff0c;然后再操作你的USB设备&#xf…