剑指offer 18 在O(1)时间内删除链表的给定结点

给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该结点。

分析:

由于需要在O(1)时间内删除结点,所以从头遍历找到结点,并删除的做法,时间复杂度显然是O(n),不符合题意

正确思路:当确保所给结点在链表中时(面试时可以询问面试官)

可以找到所要删除结点n的下一个结点n+1,并将n+1的值赋给n,之后再删除结点n+1,这样就可以保证时间复杂度是O(1)啦

注意:如果所要删除的结点n是尾结点,那么它没有下一个结点,怎么办呢?只能老实的从头遍历并删除了

另外要注意链表中只有一个结点的情况(而要删除的结点正是该结点),直接返回NULL即可。

代码:

void DeleteNode(ListNode*pHead, ListNode*ptobeDeleted)
{
	if (!pHead || !ptobeDelete)
		return;
	//要删除的节点不是尾结点
	if (ptobeDeleted->next != NULL)
	{
		ListNode*pnext = ptobeDeleted->next;
		ptobeDeleted->val = pnext->val;
		ptobeDeleted->next = pnext->next;

		delete pnext;
		pnext = NULL;//将删除的指针设为NULL,避免成为野指针
	}
	//链表只有一个结点,删除头结点(也是尾结点)
	else if (pHead == ptobeDeleted)
	{
		delete ptobeDeleted;
		ptobeDeleted = NULL;
		pHead = NULL;
	}
	//链表中有多个结点,删除尾结点
	else
	{
		ListNode*pnode = pHead;
		while (pnode->next != ptobeDeleted)
			pnode = pnode->next;
		pnode->next = NULL;
		delete ptobeDeleted;
		ptobeDeleted = NULL;
	}
}


猜你喜欢

转载自blog.csdn.net/weixin_41413441/article/details/81019480
今日推荐