用O(1)的时间复杂度删除单链表中的某个节点
来源:互联网 发布:设计师个人主页源码 编辑:程序博客网 时间:2024/05/22 02:19
给定链表的头指针和一个结点指针,在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
0 0
- 用O(1)的时间复杂度删除单链表中的某个节点
- 用O(1)的时间复杂度删除单链表中的某个节点
- 用O(1)的时间复杂度删除单链表中的某个节点
- o(1)时间删除单链表的某个节点
- 剑指offer--用O(1)的时间复杂度删除链表的节点
- 剑指offer面试题13在O(1)时间复杂度内删除单链表的一个节点
- 删除链表中的节点,时间复杂度O(1)(剑指offer)
- 单链表中实现O(1)时间复杂度删除节点
- 题目:在O(1)时间复杂度删除链表节点
- LintCode-在O(1)时间复杂度删除链表节点
- lintcode 在O(1)时间复杂度删除链表节点
- 在O(1)时间复杂度删除链表节点
- 在O(1)时间复杂度删除链表节点
- LintCode:在O(1)时间复杂度删除链表节点
- LintCode_372_在O(1)时间复杂度删除链表节点
- 在O(1)时间复杂度删除链表节点
- 在O(1)时间复杂度删除链表节点
- 在O(1)时间复杂度删除链表节点
- 排序算法
- Java中泛型的使用
- 命令模式(Command)
- netgear 网件路由器怎么了
- OpenGL_Qt学习笔记之_01(创建一个OpenGL窗口)
- 用O(1)的时间复杂度删除单链表中的某个节点
- 数据采集系统(数据调查)学习总结(—)
- 关于在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”?
- 1的补码和2的补码
- Android多媒体学习十二:Android中Video的三种播放方式的实现 .
- hadoop1.1.2java操作hdfs
- 关闭rpmbuild 对jar包的repackage 操作
- 黑马程序员_JAVA_面向对象(四)
- java 根据实体对象生成 增删改的SQL语句