要在DLL(双向链表)中插入/删除具有特定值的节点,需要遍历整个列表以查找位置,因此这些操作应为O(n)。
如果是这样,那么STL列表(最有可能使用DLL实现)如何能够在恒定时间内提供这些操作?
感谢大家向我说清楚。
答案 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) - 因为这些只是上述特殊情况。