今晚打老虎

所有博文纯为个人学习笔记

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

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)
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23930393/article/details/52358260
个人分类: 剑指offer
上一篇面试45:圆圈最后剩下的数字(约瑟夫环)
下一篇c++之指针作为函数参数传递的问题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭