在O(n)的双向链表中插入/删除的时间复杂度是多少?

时间:2010-10-10 07:42:27

标签: c++ linked-list complexity-theory

要在DLL(双向链表)中插入/删除具有特定值的节点,需要遍历整个列表以查找位置,因此这些操作应为O(n)。

如果是这样,那么STL列表(最有可能使用DLL实现)如何能够在恒定时间内提供这些操作?

感谢大家向我说清楚。

3 个答案:

答案 0 :(得分:14)

在已知位置插入和删除 是O(1)。但是,找到该位置是O(n),除非它是列表的头部或尾部。

当我们谈论插入和删除复杂性时,我们通常假设我们已经知道将要发生的位置。

答案 1 :(得分:2)

不是。 STL方法将迭代器带到插入发生的位置,严格来说,它们是O(1),因为你给它们的位置。你仍然需要在O(n)中找到自己的位置。

答案 2 :(得分:1)

删除任意值(而不是节点)确实是O(n),因为它需要找到该值。删除节点(即,当你开始知道节点时)是O(1)。

根据值插入 - 例如插入排序列表 - 将是O(n)。如果您在现有已知节点之后或之前插入O(1)。

插入列表的头部或尾部将始终为O(1) - 因为这些只是上述特殊情况。