《剑指offer》NO18.1 在O(1)时间内删除链表节点 详解 <Java实现>

//题目描述:

        //给定单项链表的头节点和一个节点的指针,定义一个函数在O(1)时间内上删除该节点。


//解题思路:

        //常规的删除操作是遍历整个链表,找到要删除的节点和他的前一个节点,把前一个节点的next指向要删除节点的下一个节点。这样做到了删除操作。
        //但是这样的时间复杂度为O(n);因为链表自带下一个节点的地址,所以我们能够立即找到目标节点的下一个节点next。用下一个节点next把目标节点覆盖;
        //这样就能立马做到删除操作。
        //但是这样有两个特例:
        //1.如果删除的节点是尾节点的话,还是需要顺序遍历整个链表来操作。
        //2.如果删除后链表没有节点了,即链表只有一个节点,即head是要删除的节点。 这样就需要把head指向null。

public class Solution
{
    public ListNode deleteNode(ListNode head,ListNode beDelete)
    {
        //如果给的头节点为空,返回空
        if (head == null)
            return null;
        //删除一个空节点返回原来的头节点
        if (beDelete == null)
            return head;
        //要删除的节点不为尾节点
        if (beDelete.next != null)
        {
            ListNode next = beDelete.next;
            beDelete.value = next.value;
            beDelete.next = next.next;
        }
        //是尾节点的话先判断链表的头结点是不是要删除的节点;是的话把head指向空。
        // 不是的话顺序遍历找到上一个结点,并把上一个结点的next置为空。
        else
        {
            if (head == beDelete)
                head = null;


            ListNode pre = head;
            while (pre.next != beDelete)
            {
                pre = head.next;
            }
            pre.next = null;
        }
        return head;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值