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

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

**

只给定单链表中某个结点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;
}
在常见的数据结构中,以下几种数据结构的插入删除操作在特定场景下时间复杂度能达到 O(1): - **链表**:链表由一系列节点组成,每个节点包含数据和指向一个节点的指针。在链表头部或已知位置插入删除节点时,只需要修改指针时间复杂度为 O(1)。例如单链表在头部插入节点,只需创建新节点并将其指针指向原头节点,再更新头指针。 - **栈**:栈是一种后进先出(LIFO)的数据结构,仅允许在栈顶进行插入(入栈)和删除(出栈)操作。由于只在栈顶操作,时间复杂度为 O(1)。 - **队列**:队列是一种先进先出(FIFO)的数据结构,通常有队头和队尾。在队尾插入元素(入队)和在队头删除元素(出队)操作的时间复杂度为 O(1)。 - **哈希表**:哈希表通过哈希函数将键映射到存储桶,在理想情况下,插入删除操作的时间复杂度为 O(1)。当发生哈希冲突时,性能可能会受到影响,但通过良好的哈希函数和冲突解决策略,平均性能仍接近 O(1)。如 Java 中的 HashMap 就是哈希表的典型实现,其插入删除操作通常能达到 O(1)时间复杂度 [^4]。 ### 代码示例 以下是 Python 实现链表、栈、队列和哈希表插入删除操作的代码示例: ```python # 链表插入删除操作 class Node: def __init__(self, data): self.data = data self.next = None class LinkedList: def __init__(self): self.head = None def insert_at_head(self, data): new_node = Node(data) new_node.next = self.head self.head = new_node def delete_at_head(self): if self.head: self.head = self.head.next # 栈的插入删除操作 class Stack: def __init__(self): self.items = [] def push(self, item): self.items.append(item) def pop(self): if self.items: return self.items.pop() # 队列的插入删除操作 class Queue: def __init__(self): self.items = [] def enqueue(self, item): self.items.append(item) def dequeue(self): if self.items: return self.items.pop(0) # 哈希表的插入删除操作 hash_table = {} # 插入操作 hash_table['key'] = 'value' # 删除操作 if 'key' in hash_table: del hash_table['key'] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值