Time complexity 单链表和双链表的插入时间是如何恒定的?

Time complexity 单链表和双链表的插入时间是如何恒定的?,time-complexity,singly-linked-list,Time Complexity,Singly Linked List,仔细想想,我认为插入和搜索任何数据结构的时间复杂度都应该是相同的,因为要插入,首先必须搜索要插入的位置,然后必须插入 根据此处:,对于链表,搜索是线性时间,但插入是固定时间。我知道搜索是线性的(从前面开始,然后一个接一个地遍历链表上的节点,直到找到要搜索的内容),但是插入时间是如何恒定的呢 假设我有这个链表: 1 -> 5 -> 8 -> 10 -> 8 我想在数字8之后插入数字2,那么我必须先搜索数字8(搜索是线性时间),然后再额外执行两个步骤来插入它(所以,插入仍然

仔细想想,我认为插入和搜索任何数据结构的时间复杂度都应该是相同的,因为要插入,首先必须搜索要插入的位置,然后必须插入

根据此处:,对于链表,搜索是线性时间,但插入是固定时间。我知道搜索是线性的(从前面开始,然后一个接一个地遍历链表上的节点,直到找到要搜索的内容),但是插入时间是如何恒定的呢

假设我有这个链表:

1 -> 5 -> 8 -> 10 -> 8
我想在数字8之后插入数字2,那么我必须先搜索数字8(搜索是线性时间),然后再额外执行两个步骤来插入它(所以,插入仍然是线性时间?)


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

因此,如果您已经有了对要插入的节点的引用,那么它就是
O(1)
。否则,它是
search\u time+O(1)
。这有点误导,但有一个图表更好地解释了这一点:

与动态数组相比,如果要在开头插入,则动态数组是:
Θ(n)


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

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


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

如果我们有一个对数据/节点的引用,那么任何可以插入的数据结构的插入时间复杂性不应该是O(1)吗?例如,在跳过列表中,如果我们引用了一个节点(称为“节点”),并且希望在“节点”之后插入y,那么我们可以只执行y.next=node.next,然后执行node.next=y。这不也是O(1)吗?不,请看在动态数组开头插入的情况。我们知道起点在哪里(希望是lol)。在一个列表中,我们只是指向下一个,在一个数组中,我们必须将所有元素移到另一个位置,所以这需要花费Θ(n)时间。@user2719875:也是FWIW,skip list take log(n)。。。不过,数组示例更易于说明。hm,请查看此问题的顶部答案:。在6个步骤中,可以在任何位置插入任何数字(即使它是数组的开头)。这不是恒定的时间吗?别担心,忽略我在上面评论中的问题。我刚刚实现了for循环,它一直重复,直到数组的长度达到=线性时间。恰好是我的网站,以及运行时间的复杂性。
#insert y after x in python 
def insert_after(x, y):
    search_for(y)
    y.next = x.next
    x.next = y