剑指offer之O(1)删除单链表节点

1.单向链表删除指定节点

  • 常规思路:从头遍历到指定节点前一个节点Pre,然后将Pre的next指向指定节点的下一个,删除指定节点即可。O(n)

  • 将指定节点下一个的内容复制到指定节点,然后删除其下一个节点。O(1)

2.代码

void deleteNode(ListNode **head, ListNode *toDelete)
{
    if(!head || !toDelete)
        return;

    if(toDelete->next != null)//非尾节点
    {
        ListNode* next = toDelete->next;
        toDelete->value = next->value;
        toDelete->next = next->next;

        delete next;
        next = NULL;
    }else if(*head == toDelete)//尾节点,但整个链表只有一个节点
    {
        delete toDelete;
        toDelete = NULL:
        *head = NULL;
    }else//尾节点,链表有多个节点
    {
        ListNode* node = *head;
        while(node->next != toDelete)
        {
            node = node->next;
        }
        node-next = NULL;
        delete toDelete;
        toDelete = NULL;
    }
}

3.复杂度

  • 仅当链表有多个节点,删除尾节点时,需要遍历,时间复杂度O(n)

  • 非尾节点或者尾节点就是头节点,都是O(1)

  • 平均复杂度还是O(1)

  • 由于受到O(1)复杂度限制,代码不能检测toDelete是否在链表中,只能假设输入无误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值