给定单向链表的头指针和一个节点指针,定义一个函数在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;
}
}