用O 1 的時間複雜度刪除單鏈表中的某個節點

2021-07-16 13:21:41 字數 946 閱讀 1506

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

/**

* definition for singly-linked list.

* public class listnode

* }*/

函式的宣告如下:

void deletenode(listnode plisthead, listnode ptobedeleted)

一般單鏈表刪除某個節點,需要知道刪除節點的前乙個節點,則需要o(n)的遍歷時間,顯然常規思路是不行的。在仔細看題目,換一種思路,既然不能在o(1)得到刪除節點的前乙個元素,但我們可以輕鬆得到後乙個元素,這樣,我們何不把後乙個元素賦值給待刪除節點,這樣也就相當於是刪除了當前元素。可見,該方法可行,但如果待刪除節點為最後乙個節點,則不能按照以上思路,沒有辦法,只能按照常規方法遍歷,時間複雜度為o(n),是不是不符合題目要求呢?可能很多人在這就會懷疑自己的思考,從而放棄這種思路,最後可能放棄這道題,這就是這道面試題有意思的地方,雖看簡單,但是考察了大家的分析判斷能力,是否擁有強大的心理,充分自信。其實我們分析一下,仍然是滿足題目要求的,如果刪除節點為前面的n-1個節點,則時間複雜度為o(1),只有刪除節點為最後乙個時,時間複雜度才為o(n),所以平均的時間複雜度為:(o(1) * (n-1) + o(n))/n = o(1);仍然為o(1).下面見**:

/* delete a node in a list with o(1)

* input: plisthead - the head of list

* ptobedeleted - the node to be deleted

*/void deletenode(listnode plisthead, listnode ptobedeleted)

else

}

用O 1 的時間複雜度刪除單鏈表中的某個節點

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

在時間複雜度O 1 內刪除單鏈表節點

題目 給定單向鍊錶的頭指標和乙個節點指標,定義乙個函式在o 1 時間內刪除該節點。鍊錶節點定義如下 public class listnode分析 有三種情況 要刪除的節點不是尾節點,時間複雜度為o 1 單鏈表中只有乙個節點,刪除頭節點,時間複雜度為o 1 單鏈表中有多個節點,要刪除的為尾節點,時間...

資料結構 刪除單鏈表中p節點,時間複雜度O 1

在plist中刪除p節點,時間複雜度要求o 1 因為時間複雜度為o 1 所以常規思路遍歷鍊錶是不行的。刪除節點,其實是把該節點資料域清除,已知了p節點,那麼可以知道它的next節點,所以可以把p節點的下乙個節點的資料域賦值給p節點資料域,再讓p節點的next指向p next next,就實現了p節點...