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

题目:题目:给定链表的头指针和一个结点指针,在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)给定的要删除的结点不是链表的头结点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值