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

时间:2019-02-16
本文章向大家介绍在O(1)时间删除链表结点,主要包括在O(1)时间删除链表结点使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

思路:
一般的想法是从头开始遍历,直到找到要删除的节点p的前一个节点temp,然后让temp->next指向p->next即可
这种思路时间复杂度是O(n)的
我们分情况考虑,如果要删除的节点p不是尾部节点,我们可以让p拷贝p->next节点的信息,然后删除p->next节点即可,这种时间复杂度是O(1)的,如果p是尾部节点,那么还是要从头遍历。
注意delete节点之后,要把节点置为nullptr


struct ListNode
{
	int       m_nValue;
	ListNode* m_pNext;
};

void DeleteNode(ListNode** head, ListNode* p)
{
	if (head == nullptr || p == nullptr)
		return;
	
	if (p->m_pNext != nullptr)//要删除的节点不是尾节点
	{
		ListNode* temp = p->m_pNext;
		p->m_nValue = temp->m_nValue;
		p->m_pNext = temp->m_pNext;
		delete temp;
		temp = nullptr;
	}
	else if (*head == p)//只有一个节点或删除头结点
	{
		delete p;
		p = nullptr;
		head = nullptr;
	}
	else//链表中有多个节点,删除尾节点
	{
		ListNode* temp = *head;
		while (temp->m_pNext != p)
			temp = temp->m_pNext;
		temp->m_pNext = nullptr;
		delete p;
		p = nullptr;
	}
}