在O 1 的時間刪除鍊錶結點

2021-08-03 03:34:44 字數 1076 閱讀 2791

1 /*

2     在o(1)的時間刪除鍊錶結點

3     給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o(1)時間刪除該結點。鍊錶結點與函式的定義如下

4     struct listnode

5     ;

910     void deletenode(listnode** plisthead,listnode* ptobedeleted);

11 */

1213 /*

14     在單向鍊錶中刪除乙個結點,最常規的做法無疑是從鍊錶的頭結點開始,順序遍歷查詢要刪除的結點,並在鍊錶中刪除該結點。

15     自然。這樣的時間複雜度為o(n),達不到題目的要求。需要遍歷去查詢到將要刪除的結點的前面乙個結點。在單向鍊錶中,結點中沒

有指向前乙個結點的指標,所以只能從頭結點開始順序查詢。

16     那是不是一定需要得到被刪除的結點的前乙個結點呢?答案是否定的。我們可以很方便得到要刪除結點的下乙個結點。如果我們把下

乙個結點的內容複製到需要刪除的結點上覆蓋原有的內容,再把下乙個結點刪除,那是不是就相當於把當前需要刪除的結點刪除了。

17     但是如果要刪除的結點位於鍊錶的尾部,那麼它就沒有下乙個結點,怎麼辦?我們任然從鍊錶的頭結點開始,順序遍歷得到該結點的

前序結點,並完成刪除操作。

18     最後需要注意的是,如果鍊錶中只有乙個結點,而我們又要刪除鍊錶的頭結點(也是尾結點),此時我們在刪除結點之後,還需要把

鍊錶的頭結點設定為null.

19     對應的**如下:

20 */

22 void deletenode(listnode** plisthead,listnode* ptobedeleted)

23 36 37 //只有乙個結點

38 else if(plisthead == ptobedeleted)

39

44 45 //鍊錶中有多個結點,刪除尾結點。要刪除的結點為尾結點。

46 else

47

56 }

在O 1 時間刪除鍊錶結點

題目 給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。鍊錶結點與函式的定義如下 struct listnode void deletenode listnode plisthead,listnode ptobedeleted 刪除結點的操作我們經常碰到,比如乙個鍊錶a b ...

在O 1 時間刪除鍊錶結點

問題描述 給定單向鍊錶的頭指標和乙個結點指標 定義乙個函式在o 1 時間刪除鍊錶結點。鍊錶結點與函式的定義如下 struct listnode void deletenode listnode plisthead listnode ptobedeleted 思路 在單向鍊錶中刪除乙個結點,最常用的做...

在O 1 時間刪除鍊錶結點

題目 題目 給定鍊錶的頭指標和乙個結點指標,在o 1 時間刪除該結點。思路 通常情況下,如果我們要刪除單鏈表的乙個節點,我們需要遍歷鍊錶找到這個節點的前乙個節點,然後執行刪除操作,時間複雜度為o n 我們試著換一種思路,事實上,我們可以從給定的結點得到它的下乙個結點。這個時候我們實際刪除的是它的下乙...