题目:题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。
思路:通常情况下,如果我们要删除单链表的一个节点,我们需要遍历链表找到这个节点的前一个节点,然后执行删除操作,时间复杂度为O(n).
我们试着换一种思路,事实上,我们可以从给定的结点得到它的下一个结点。这个时候我们实际删除的是它的下一个结点,由于我们已经得到实际删除的结点的前面一个结点,因此完全是可以实现的。当然,在删除之前,我们需要需要把给定的结点的下一个结点的数据拷贝到给定的结点中。此时,时间复杂度为O(1)。
struct ListNode {
int value;
ListNode *next;
};
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted){
if(pListHead == NULL || pToBeDeleted == NULL)
return;
if(pToBeDeleted->next != NULL){
ListNode *pnext = pToBeDeleted->next;
pToBeDeleted->value = pnext->value;
pToBeDeleted->next= pnext->next;
delete pnext;
pnext = NULL;
}
else{
ListNode *pnode = pListHead;
while(pnode->next != pToBeDeleted){
pnode = pnode->next;
}
pnode->next = NULL;
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}
上面的代码基于两个假设:(1)给定的结点的确在链表中;(2)给定的要删除的结点不是链表的头结点。