以O 1 時間複雜度刪除鍊錶中的結點

2021-06-23 05:11:50 字數 700 閱讀 2760

剛看到這個題的時候我還琢磨,刪除鍊錶中的結點,我怎麼判斷這個結點就是這個鍊錶中的呢?如果判斷這個結點在鍊錶中就已經需要乙個掃瞄的時間了,就不可能以o(1)的複雜度了。所以這個題目應該改為,如何以o(1)時間複雜度刪除鍊錶中(已知)的結點,確保該結點存在。

然後自己實現一遍:

void deletenode(listnode* node)

else

}

如果

該節點是最後乙個結點,直接刪除;

如果是中間的結點,則刪除該結點的下乙個結點,並把下乙個結點的值賦值到該結點。

本以為這樣就可以了,但是還存在很大的問題,就是第一種情況,如果該結點是最後乙個結點的時候。因為,單鏈表中都會有乙個指向下乙個結點的指標。當我們把最後乙個結點刪除的時候,倒數第二個結點的指標指向的下乙個位置是依然存在的,只是此時我們不知道它具體指的是什麼,如果此時再對整個鍊錶進行操作的時候,最後乙個元素便會帶來位置的錯誤。

所以,我們刪除最後乙個節點時,必須先定位到鍊錶的倒數第二個結點,然後將該結點的next置為空,這樣我們再使用這個結點的時候才不會出現問題。

void deletenode(listnode* head, listnode* node)

if (node->next == null)

else

}} else

}

O 1 時間複雜度刪除鍊錶元素

package lineartable 鍊錶節點類 class node 鍊錶類 public class linktable 增加節點 public void addnode node node end.next node 刪除節點 時間複雜度為o 1 無需遍歷鍊錶元素 public void d...

刪除鍊錶結點要求O 1 時間複雜度

一,題目 給定鍊錶的頭指標和乙個結點指標,在 o 1 時間刪除該結點。鍊錶結點的定義如下 struct listnode 函式的宣告如下 void deletenode listnode plisthead,listnode ptobedeleted 二,分析 這是一道廣為流傳的 google 面試...

在O 1 時間複雜度刪除鍊錶節點

給定乙個單鏈表中的乙個等待被刪除的節點 非表頭或表尾 請在在o 1 時間複雜度刪除該鍊錶節點。給定1 2 3 4,和節點3,刪除 3之後,鍊錶應該變為1 2 4。因為給定節點在鍊錶的中間,所以不可能用一步步迭代找到這個節點的前驅,那就得換個思路來思考這個問題。題目並未說不可以更改節點的元素,所以可以...