关闭

面试13:在O(1)时间删除链表结点

187人阅读 评论(0) 收藏 举报
分类:

O(n)

常规:链表开头开始,顺序遍历查找要删除的结点,并在链表删除该结点
h的next指向要删除的结点i,h->next指向i的下一结点j,此时删除j保证链表不断开
这种方法要找到删除结点的前一结点


O(1)
把下一结点的内容复制到i,i的指针指向j的下一结点
1)删除结点在链表尾部,没有下一结点,只能顺序遍历得到该结点的前序结点,完成删除
2)链表只有一个结点删除结点后把链表头结点设置为NULL

void DeleteNode(ListNode** pListHead,ListNode* pToBeDelete)
{
	if(!pListHead||!pToBeDeleted)
		return;
	//删除的结点不是尾结点
	if(pToBeDeleted->next!=NULL)
	{
		ListNode* pNext=pToBeDeleted->next;
		pToBeDeleted->val=pNext->val;
		pToBeDeleted->next=pNext->next;
		
		delete pNext;
		pNext=NULL;
	}
	//链表只有一个结点
	else if(*pListHead==pToBeDeleted)
	{
		delete pToBeDeleted;
		pToBeDeleted=NULL;
		*pListHead=NULL;
	}
	//链表中有多个结点,删除尾结点
 	else
	{
		ListNode *pNode=*pListHead;
		while(pNode->next!=pToBeDeleted)
		{
			pNode=pNode->next;
		}
		pNode->next=NULL;
		delete pToBeDeleted;
		pToBeDeleted=NULL;
	}
}
//思考如果删除结点不在链表中


总的平均时间复杂度[(n-1)*O(1)+O(n)]/n,结果还是O(1)

0
0
查看评论

剑指offer--面试题13:在O(1)时间删除链表结点--Java实现

题目描述: 在给定的单向列表的头指针和一个结点指针,定义在一个函数在O(1)时间删除该结点。解题思路: 一般单向列表删除结点,就是从头遍历,找到这个结点之前的结点,指向这个结点之后的结点,就算是删除了这个结点。 这种方法的时间复杂度为O(n) 题目要求在O(1)时间内完成,所以应该避免遍历。...
  • u012289407
  • u012289407
  • 2015-05-18 21:57
  • 1234

单向链表在O(1)时间内删除一个节点

单向链表在O(1)时间内删除一个节点
  • Li_Ning_
  • Li_Ning_
  • 2016-06-05 12:36
  • 2280

在O(1)时间删除链表结点——13

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。    因为要求时间复杂度为O(1),所以肯定不能遍历链表,那样的话时间复杂度就是O(N)了;可以想到,其实要求删除该结点,真正的目的并不是要将结点的数据包括结点所占的内存都给删除,只是想让数据消失就可以了...
  • Miss_Bread
  • Miss_Bread
  • 2017-10-20 20:41
  • 37

在O(1)时间删除链表结点(13)

题目:给定单项链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。//链表的结构如下 struct ListNode { int m_nvalue; ListNode* m_pnext; };void DeleteNode(ListNode** pListHead , ...
  • wangle965235568
  • wangle965235568
  • 2017-12-18 20:27
  • 21

LintCode-在O(1)时间复杂度删除链表节点

给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。并在删除该节点后,返回表头。您在真实的面试中是否遇到过这个题? Yes 样例 给定 1->2->3->4,和节点 3,返回 1->2->4。标签 Expand 相...
  • xiaowei132
  • xiaowei132
  • 2015-08-31 20:08
  • 826

剑指Offer面试题13(java版):在O(1)时间删除链表节点

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。 在单向链表中删除一个节点,最常规的方法无疑是从链表的头结点开始,顺序遍历查找要删除的节点,并在链表中删除该节点。 比如图a所表示的链表中,我们要删除节点i,可以从链表的头节点a开始顺序遍历,发现节点h的m_PNex...
  • jsqfengbao
  • jsqfengbao
  • 2015-07-31 20:55
  • 2225

面试题13:在O(1)时间 内删除链表节点

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。链表节点与函数的定义如下: struct ListNode { int value; ListNode* next; }void DeleteNode(ListNode* head,ListNode* p...
  • SmartBrave
  • SmartBrave
  • 2016-06-11 11:02
  • 1144

【面试题】在O(1)时间复杂度删除链表节点

题目描述给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。并在删除该节点后,返回表头。样例 给定 1->2->3->4,和节点 3,返回 1->2->4。(372) Delete Node in the Middle...
  • zwhlxl
  • zwhlxl
  • 2015-07-28 15:01
  • 2148

删除链表结点O(1)时间

删除链表结点,根据结点的位置,和链表结点数量可分三种情况 1.删除非尾结点,链表的结点数量 >= 2 2.删除只有一个结点的链表,结点数量 == 1 3.删除尾结点,结点数量 >= 2 当然,上面这个3中情况都是已经确定要删除结点在链表中,这个我在delete_node函数内没有...
  • jun2016425
  • jun2016425
  • 2017-09-17 11:52
  • 153

在O(1)时间删除指定链表结点

#region 在O(1)时间删除指定链表结点 /// /// 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。 /// /// class MyList where T:IComparable { pr...
  • ywjun0919
  • ywjun0919
  • 2013-08-28 23:39
  • 857
    个人资料
    • 访问:26282次
    • 积分:993
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:42篇
    • 译文:0篇
    • 评论:7条
    小仓鼠
    最新评论