单链表和双链表的插入时间如何?

Posted

技术标签:

【中文标题】单链表和双链表的插入时间如何?【英文标题】:How is insertion for a Singly Linked List and Doubly Linked List constant time? 【发布时间】:2015-12-01 21:19:15 【问题描述】:

想来想去,我觉得插入和搜索任何数据结构的时间复杂度应该是一样的,因为要插入,首先要搜索到要插入的位置,然后再插入。

根据这里:http://bigocheatsheet.com/,对于链表,搜索是线性时间但插入是常数时间。我明白搜索是如何线性的(从前面开始,然后继续遍历链表上的节点,直到找到要搜索的内容),但是插入恒定时间如何?

假设我有这个链表:

1 -> 5 -> 8 -> 10 -> 8

我想在数字 8 之后插入数字 2,那么我是否必须先搜索数字 8(搜索是线性时间),然后再多走 2 步插入它(所以,插入仍然是线性时间?)?

#insert y after x in python 
def insert_after(x, y):
    search_for(y)
    y.next = x.next
    x.next = y

编辑:即使对于双向链表,它是否仍然必须先搜索节点(这是线性时间),然后插入?

【问题讨论】:

bigocheatsheet.com 恰好是我的首选网站,也适用于运行时的复杂性。 【参考方案1】:

因此,如果您已经有对要尝试插入的节点的引用,那么它就是O(1)。否则为search_time + O(1)。这有点误导,但on wikipedia 有一张图表解释得更好:

将此与动态数组进行对比,如果要在开头插入,则为:Θ(n)

只是为了强调:您所引用的网站指的是实际的插入行为,因为我们已经知道要插入的位置。

【讨论】:

好吧,如果我们有对数据/节点的引用,那么任何可以插入的数据结构的插入时间复杂度不应该是 O(1) 吗?例如,在跳过列表中,如果我们引用了一个节点(称为 'node'),并且想要在 'node' 之后插入 y,那么我们可以只执行 y.next = node.next 然后 node.next =是的。不也是 O(1) 吗? 不行,看在动态数组开头插入的情况。我们知道开始在哪里(希望哈哈)。在列表中我们只指向下一个,在数组中我们必须移动所有元素,因此需要 Θ(n) 时间。 @user2719875:FWIW,skip list take log(n)...虽然数组示例更容易说明。 hm,看看这个问题的最高答案:***.com/questions/11638123/…。在 6 步中,可以在任意位置插入任意数字(即使它是数组的开头)。那不也是固定时间吗? 没关系,忽略我在上面评论中的问题。我刚刚意识到 for 循环会重复直到达到数组的长度 = 线性时间。【参考方案2】:

插入时间 = 设置三个指针的时间 = O(3) = 恒定时间。

插入数据的时间与在特定位置插入数据的时间不同。所要求的时间是插入数据的时间而已。

【讨论】:

以上是关于单链表和双链表的插入时间如何?的主要内容,如果未能解决你的问题,请参考以下文章

数据结构[双链表的实现,以及双链表和单链表之间的比较,链表和顺序表的优劣]

深度解析数组单链表和双链表

[每日算法220508] 单链表和双链表的反转

Redis双端链表

[每日算法220508] 单链表和双链表的反转

[每日算法220508] 单链表和双链表的反转