关闭

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

104人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16887次
    • 积分:885
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:42篇
    • 译文:0篇
    • 评论:7条
    最新评论