首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
给定链表的头指针和一个结点指针,在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
78
问题
给定链表的头指针和一个结点指针,在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://kaotiyun.com/show/wRmZ777K
0
程序员面试
相关试题推荐
Notuntilthe1980’s______inBeijingstarttofindwaystopreservehistoricbuildingsfromdestruction.
Weakdollarorno,$46,000—thepriceforasingleyearofundergraduateinstructionamidtheredbrickofHarvardYard—is【C1】__
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
两个单向链表,找出它们的第一个公共结点。链表的结点定义为:structListNode{intm_nKey;ListNode*m_pNext;};
办公自动化是目前广泛开展的一项计算机应用,按类分,它应属于下列哪一类()A.科学计算B.计算机辅助设计C.实时控制D.数据处理
计算机能直接识别和执行的语言是()A.机器语言B.高级语言C.数据库语言D.汇编程序
在foxpro中定义数据库结构时,字段名的宽度最多可以是()。A.2B.4C.10D.16
在计算机的应用中,cad是指()。A.计算机辅助制造B.计算机辅助教学C.计算机辅助设计D.计算机辅助测试
在Excel2003中,利用“图表选项”对话框,可以设置或修改图标的()。
随机试题
A.意识障碍B.精神症状C.意识丧失和全身抽搐D.抽搐E.以上都不是癫痫大发作的特点是
根据合同技术条款计量和支付规则,场地平整的计量单位是()。
K注册会计师审计了T公司2005年度的财务报表,出具了无保留意见的审计报告。2006年11月下旬,K注册会计师获知T公司在其2005年度财务报表的审计报告日已存在、可能导致修改审计报告的重大事实。如果这一事实能够在下一期财务报表中进行充分披露,且下一期财务
简述图形与图像的区别。
中华人民共和国副主席必须年满()。
当非酒精性脂肪肝病发展到严重的炎症阶段,肝脏内巨噬细胞就会异常活跃起来,?它们会从血液中募集更多兄弟炎症细胞,例如白细胞就会进到肝脏里面,出现炎症细胞浸润。这个时候如果做病理分析,就会看到肝脏里面有很多炎症细胞,围着变大的肝脏细胞。这就说明肝脏细胞里边“出
城市民用天然气的主要成分是()。
f(χ)=,求f(χ)的间断点并分类.
•Youwillhearfiveshortrecordings.•Foreachrecording,decidewhatthespeakeristryingtodo.•Writeoneletter(A--H)nex
Forthispart,youareallowed30minutestowriteanessaycommentingontheremark"Thetruemeasureofamanishowhetreats
最新回复
(
0
)