O(1)时间的插入与删除

本文探讨如何在给定单链表的某个结点p前进行O(1)时间的插入操作,以及如何在O(1)时间内删除该结点。条件包括确保结点在链表中且链表非空。插入操作通过交换值实现,而删除操作则通过将结点后继节点的值替换到被删除节点并移除后继节点完成。平均时间复杂度为O(1)。

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

**

只给定单链表中某个结点p,O(1)时间内在p前面插入一个结点。返回头结点。

**
**要询问节点是否一定在链表中(否则判断的时间复杂度为O(n)),是否为空等这些条件。
采用交换值的方法,相当于在该节点后插入节点。

public static ListNode insertNodeBeforeNode(ListNode head, ListNode node, ListNode newNode){
    if(newNode==null) return null;
    if(head == null && node == null) head = newNode;//链表为空
    else if(node == null){//在尾节点插入
        ListNode p = head;
        for(; p.next != null; p = p.next);
        p.next = newNode;
    }else{//在中间的结点前(包括头结点)插入
        newNode.val ^= node.val;
        node.val ^= newNode.val;
        newNode.val ^= node.val;
        newNode.next = node.next;
        node.next = newNode;
    }
    return head;
}

**

只给定单链表中某个结点p,O(1)时间内删除该结点。返回头结点。

**
**要询问节点是否一定在链表中(否则判断的时间复杂度为O(n)),是否为空等这些条件。
同样采用交换值的方法,相当于删除后一个节点。
时间复杂度:如果删除中间的节点,复杂度为O(1).删除尾结点,复杂度为O(n)。平均复杂度为{(n-1)O(1)+O(n)}/n = O(1)

public static ListNode deleteNode(ListNode head, ListNode node){
    if(head == null || node == null) return null;
    else if(node.next == null){//删除尾结点
        if(node == head) head = null;
        else{
            ListNode p = head;
            for(; p.next != null && p.next.next != null; p = p.next);
            p.next = null;
        }
    }else{//删除中间的结点
        node.next.val ^= node.val;
        node.val ^= node.next.val;
        node.next.val ^= node.val;
        node.next = node.next.next;
    }
    return head;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值