首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: void DeleteNode(L
给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: void DeleteNode(L
admin
2019-03-29
73
问题
给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
选项
答案
/////////////////////////////////////////////////////////////////////// // Delete a node in a list // Input: pListHead - the head of list // pToBeDeleted - the node to be deleted /////////////////////////////////////////////////////////////////////// void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted) { if(!pListHead || !pToBeDeleted) return; // if pToBeDeleted is not the last node in the list if(pToBeDeleted->m_pNext != NULL) { // copy data from the node next to pToBeDeleted ListNode* pNext = pToBeDeleted->m_pNext; pToBeDeleted->m_nKey = pNext->m_nKey; pToBeDeleted->m_pNext = pNext->m_pNext; // delete the node next to the pToBeDeleted delete pNext; pNext = NULL; } // if pToBeDeleted is the last node in the list else { // get the node prior to pToBeDeleted ListNode* pNode = pListHead; while(pNode->m_pNext != pToBeDeleted) { pNode = pNode->m_pNext; } // deleted pToBeDeleted pNode->m_pNext = NULL; delete pToBeDeleted; pToBeDeleted = NULL; } } 值得注意的是,为了让代码看起来简洁一些,上面的代码基于两个假设:(1)给定的结点的确在链表中;(2)给定的要删除的结点不是链表的头结点。不考虑第一个假设对代码的鲁棒性是有影响的。至于第二个假设,当整个列表只有一个结点时,代码会有问题。但这个假设不算很过分,因为在有些链表的实现中,会创建一个虚拟的链表头,并不是一个实际的链表结点。这样要删除的结点就不可能是链表的头结点了。当然,在面试中,我们可以把这些假设和面试官交流。这样,面试官还是会觉得我们考虑问题很周到的。
解析
这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解。
在链表中删除一个结点,最常规的做法是从链表的头结点开始,顺序查找要删除的结点,找到之后再删除。由于需要顺序查找,时间复杂度自然就是O(n) 了。
我们之所以需要从头结点开始查找要删除的结点,是因为我们需要得到要删除的结点的前面一个结点。我们试着换一种思路。我们可以从给定的结点得到它的下一个结点。这个时候我们实际删除的是它的下一个结点,由于我们已经得到实际删除的结点的前面一个结点,因此完全是可以实现的。当然,在删除之前,我们需要需要把给定的结点的下一个结点的数据拷贝到给定的结点中。此时,时间复杂度为O(1)。
上面的思路还有一个问题:如果删除的结点位于链表的尾部,没有下一个结点,怎么办?我们仍然从链表的头结点开始,顺便遍历得到给定结点的前序结点,并完成删除操作。这个时候时间复杂度是O(n)。
那题目要求我们需要在O(1)时间完成删除操作,我们的算法是不是不符合要求?实际上,假设链表总共有n个结点,我们的算法在n-1总情况下时间复杂度是O(1),只有当给定的结点处于链表末尾的时候,时间复杂度为O(n)。那么平均时间复杂度[(n-1)*O(1)+O(n)]/n,仍然为O(1)。
转载请注明原文地址:https://jikaoti.com/ti/Pfg7FFFM
0
程序员面试
相关试题推荐
Notuntilthe1980’s______inBeijingstarttofindwaystopreservehistoricbuildingsfromdestruction.
ThepublicationofPM2.5datahasbecomeanationalhottopic.Theenvironmentinstituteplanstoholdarelevantlecture.AsC
什么是ASP.net中的用户控件
输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:structListNode{intm_nKey;ListNode*m_pNext;};
Office2000Office2000中文版中文版用()实现A.插入符号B.并排字符C.组合字符D.首字下沉
在Word中,水平标尺上数字的单位是()。A.厘米B.字符个数C.点D.汉字个数
在foxpro中,要浏览多个数据库的字段,以下说法中正确的是()并允许进行字段的修改。A.使用listfields命令 B.browsefields命令C.前两者都不对 D.不能在command命令窗口中实现
在Excel中,公式SUM(C2:C6)的作用是()。A.求C2到C6这五个单元格数据之和B.求C2和C6这两个单元格数据之和C.求C2和C6两单元格的比值D.以上说法都不对
在使用SELECT-SQL语句进行查询操作时,可以进行集合的并运算,即将多个基本的SELECT-SQL语句运行结果进行合并。这时,需要使用关键词(或称为运算符)________将多个基本的SELECT-SQL语句进行组合。
在数据库系统中,“事务”是访问数据库并可能更新各种数据项的一个程序执行单元。为了保证数据完整性,要求数据库系统维护事务的原子性、一致性、隔离性和持久性。针对事务的这4种特性,考虑以下的架构设计场景:假设在某一个时刻只有一个活动的事务,为了保证事务
随机试题
为什么说天才是客观存在的?
甲亢术后出现黏液水肿和脉缓是由于()
A、引导性组织再生术+植骨术B、游离龈瓣移植术C、根向复位瓣术D、截根术E、牙龈切除术下列情况最可能采取的术式右下第一磨牙2度根分叉病变,龈缘高度低,角化龈过窄,牙周袋底超过膜龈联合
患者,男,68岁,右下牙龈癌,拟行颌颈联合根治术+胸大肌、肋骨复合组织瓣修复术。该骨肌皮瓣转移修复后.应主要注意观察下列哪一项
既可提高对失眠症的疗效,又可逐渐摆脱对西药的依赖性的是()。
大名公司需要一套小名公司生产的成套设备用来生产石英表,双方找未名公司商议,由未名公司购买并直接租给大名公司。于是大名公司、小名公司、未名公司签订如下合同:(1)由未名公司付给小名公司货款700万元,于当年年底和第二年年底两次付清,货款付清后所有权转移;(2
主板(中小企业板)上市公司存在下列()情形时,不得非公开发行股票。①现任董事、高级管理人员最近三十六个月内受到过中国证监会的行政处罚,或者最近十二个月内受到过证券交易所公开谴责②上市公司或其现任董事、高级管理人员因涉嫌犯罪正被司法机
下列关于艺术的表述错误的是()。
下列各句中成语的使用,正确的一项是:①小李经过五年的努力,村边鱼塘已初具规模,他现在可以______了。②教育部取消考生报考普通高等院校的年龄及婚否限制之后,许多大龄青年______,决心圆大学之梦。③近年来,《苹果日报》在香港引
以下五个题使用如下关系:客户(客户号,名称,联系人,邮政编码,电话号码)产品(产品号,名称,规格说明,单价)订购单(订单号,客户号,订购日期)订购单名细(订单号,序号,产品号,数量)查询单价在600元以上的主机板
最新回复
(
0
)