10 在O(1)时间删除链表节点:给定单向链表的一个头指针和节点指针,定义一个函数在O(1)时间删除该节

本文介绍了一种在O(1)时间内删除单向链表中给定节点的方法,通过将当前节点值替换为下一个节点值并调整指针,实现快速删除。特殊情况如头结点和尾节点的处理也进行了详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目
给定单向链表的一个头指针和节点指针,定义一个函数在O(1)时间删除该节点。
二、解题思路
由于给定了节点指针,那么要删除该节点。只要把该节点的值替换为下一个节点的值,同时让该节点直接指向下一个节点的下一个节点。相当于顶包代替了下一个节点,该节点自然就不存在。
需要注意的是如果指定节点是头结点,那么直接把头结点定义为下一个节点即可。如果是尾节点,需要循环遍历到该节点,然后让尾节点的上一个节点的指针为空即可。

如果删除的结点位于链表的尾部,没有下一个结点,怎么办?

我们仍然从链表的头结点开始,顺便遍历得到给定结点的前序结点,并完成删除操作。这个时候时间复杂度是O(n)。那题目要求我们需要在O(1)时间完成删除操作,我们的算法是不是不符合要求?

实际上,假设链表总共有n个结点,我们的算法在n-1总情况下时间复杂度是O(1),只有当给定的结点处于链表末尾的时候,时间复杂度为O(n)。那么平均时间复杂度[(n-1)*O(1)+O(n)]/n

来源:优快云 
原文:https://blog.youkuaiyun.com/danielzhou888/article/details/83627014 
--------------------- --------------------- --------------------- --------------------- 



public  static ListNode delete(ListNode head ,ListNode toBeDeleted){
        
        if(head==null||toBeDeleted==null) {
            return null;
            
        }
        if(head==toBeDeleted) {
            return head.next;

        }
        //最后一个
        if(toBeDeleted.next==null) {
            ListNode temp=head;
            while (temp.next!=toBeDeleted){
                temp=temp.next;
            }
            //删除节点
            temp.next=null;

        }else {
            //中间节点     让给节点的下一个节点顶包被删除
            toBeDeleted.value=toBeDeleted.next.value;
            toBeDeleted.next=toBeDeleted.next.next;
        }



        return head;
    } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值