給定鍊錶的頭指標和乙個結點指標,在o(1)時間刪除該結點。鍊錶結點的定義如下:
structlistnode
;
函式的宣告如下:
void deletenode(listnode* plisthead, listnode* ptobedeleted);
這是一道廣為流傳的google面試題,考察我們對鍊錶的操作和時間複雜度的了解,咋一看這道題還想不出什麼較好的解法,但人家把題出在這,肯定是有解法的。一般單鏈表刪除某個節點,需要知道刪除節點的前乙個節點,則需要o(n)的遍歷時間,顯然常規思路是不行的。在仔細看題目,換一種思路,既然不能在o(1)得到刪除節點的前乙個元素,但我們可以輕鬆得到後乙個元素,這樣,我們何不把後乙個元素賦值給待刪除節點,這樣也就相當於是刪除了當前元素。可見,該方法可行,但如果待刪除節點為最後乙個節點,則不能按照以上思路,沒有辦法,只能按照常規方法遍歷,時間複雜度為o(n),是不是不符合題目要求呢?可能很多人在這就會懷疑自己的思考,從而放棄這種思路,最後可能放棄這道題,這就是這道面試題有意思的地方,雖看簡單,但是考察了大家的分析判斷能力,是否擁有強大的心理,充分自信。其實我們分析一下,仍然是滿足題目要求的,如果刪除節點為前面的n-1個節點,則時間複雜度為o(1),只有刪除節點為最後乙個時,時間複雜度才為o(n),所以平均的時間複雜度為:(o(1) * (n-1) + o(n))/n = o(1);仍然為o(1).下面見**:
struct listnode ;
void deletenode(listnode *plisthead, listnode *ptobedeleted)
else }
有個限制條件:當刪除節點為頭結點時,處理函式是有問題的。所以推測題目應該限制頭結點沒有資料,只是乙個頭結點
用O 1 的時間複雜度刪除單鏈表中的某個節點
給定鍊錶的頭指標和乙個結點指標,在o 1 時間刪除該結點。鍊錶結點的定義如下 definition for singly linked list.public class listnode 函式的宣告如下 void deletenode listnode plisthead,listnode pto...
在時間複雜度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節點...