剛看到這個題的時候我還琢磨,刪除鍊錶中的結點,我怎麼判斷這個結點就是這個鍊錶中的呢?如果判斷這個結點在鍊錶中就已經需要乙個掃瞄的時間了,就不可能以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。因為給定節點在鍊錶的中間,所以不可能用一步步迭代找到這個節點的前驅,那就得換個思路來思考這個問題。題目並未說不可以更改節點的元素,所以可以...