题目描述:
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
解题思路:
(1)常规思路:
在单向链表中删除一个结点,最常规的做法无疑是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。这种思路由于需要顺序查找,时间复杂度自然就是O(n)。
(2)正确思路:
我们可以很方便地得到要删除的结点的一下结点。因此,我们可以把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除,就相当于把当前需要删除的结点删除了。
Demo:
struct ListNode
{
int value;
ListNode *next;
}*ptrNode;
void DeleteNode(ptrNode head, ptrNode target)
{
if (head == nullptr || target == nullptr)
return;
// 要删除的节点不是尾节点
if (target->next != nullptr)
{
ptrNode pNext = target->next;
target->value = pNext->value;
target->next = pNext->next;
delete pNext;
pNext = nullptr; // 避免出现野指针
}
// 只有一个指针
if (target == head)
{
delete target;
pNext = nullptr;
head = nullptr;
}
// 尾指针,只能遍历
else
{
ptrNode ptr = head;
while (ptr->next != target)
ptr = ptr->next;
ptr->next = nullptr;
delete target;
target = nullptr;
}
}