2010-10-10 105 views
3

要在DLL(雙向鏈表)整個列表中插入/刪除一個具有特定值的節點,需要通過遍歷來查找位置,因此這些操作應該是O(n)。在O(n)的雙向鏈表中插入/刪除的時間複雜度是多少?

如果是這種情況,那麼怎麼來STL列表(最有可能使用DLL實現)能夠在固定時間提供這些操作?

謝謝大家對我說清楚。

回答

12

插入和刪除在已知位置是O(1)。然而,找到那個位置是O(n),除非它是列表的頭部或尾部。

當我們談論插入和刪除複雜性時,我們通常假設我們已經知道將會發生什麼。

+3

+1 - *除非它是列表的頭部或尾部。* - 它也是O(1)找到列表中的第二個位置。第3位... – 2010-10-10 07:47:56

+2

通過歸納,在列表中找到位置n是O(1)... heywaitaminute! :p – Edmund 2010-10-10 09:08:09

1

刪除一個任意值(而不是一個節點)確實是O(n),因爲它需要找到這個值。刪除一個節點(即當你開始瞭解節點時)是O(1)。

基於值插入 - 例如,插入排序的列表 - 將是O(n)。如果您在現有已知節點之後或之前插入O(1)。

插入到列表的頭部或尾部將始終爲O(1) - 因爲這些只是上述的特例。

2

不是。 STL方法將迭代器帶到要插入的位置,所以嚴格來說,它們是O(1),因爲您在給它們定位。但是,您仍然必須自己在O(n)中找到自己的位置。

相關問題