經典面試題 在O 1 時間刪除鍊錶結點

2021-09-08 22:45:45 字數 1692 閱讀 8623

【題目】

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

struct listnode

;函式的宣告例如以下:

void deletenode(listnode* head,listnode* node);

【思路】

這是一道廣為流傳的google面試題,能有效考察我們的程式設計基本功,還能考察我們的反應速度,更重要的是,還能考察我們對時間複雜度的理解。

在鍊錶中刪除乙個結點,最常規的做法是從鍊錶的頭結點開始,順序查詢要刪除的結點,找到之後再刪除。因為須要順序查詢,時間複雜度自然就是o(n) 了。

我們之所以須要從頭結點開始查詢要刪除的結點。是由於我們須要得到要刪除的結點的前面乙個結點。

我們試著換一種思路。我們能夠從給定的結點得到它的下乙個結點。

這個時候我們實際刪除的是它的下乙個結點。由於我們已經得到實際刪除的結點的前面乙個結點,因此全然是能夠實現的。

當然。在刪除之前。我們須要須要把給定的結點的下乙個結點的資料複製到給定的結點中。此時。時間複雜度為o(1)。

上面的思路另乙個問題:假設刪除的結點位於鍊錶的尾部,沒有下乙個結點。怎麼辦?我們仍然從鍊錶的頭結點開始,順便遍歷得到給定結點的前序結點,並完畢刪除操作。這個時候時間複雜度是o(n)。

那題目要求我們須要在o(1)時間完畢刪除操作,我們的演算法是不是不符合要求?實際上,如果鍊錶總共同擁有n個結點,我們的演算法在n-1總情況下時間複雜度是o(1)。僅僅有當給定的結點處於鍊錶末尾的時候,時間複雜度為o(n)。那麼平均時間複雜度[(n-1)*o(1)+o(n)]/n,仍然為o(1)。

基於前面的分析。我們不難寫出以下的**。

/*********************************

* 日期:2014-10-29

* 題目: 給定鍊錶的頭指標和乙個結點指標,在o(1)時間刪除該結點

* 總結:

**********************************/

#include #include #include using namespace std;

struct listnode

};//o(1)時間 刪除鍊錶中的節點

void deletenode(listnode** head,listnode* node)

listnode* p = node->next;

// 刪除的不是末尾節點 o(1)

if(p != null)

// 刪除的是末尾節點 o(n)

else

//刪除node節點

pre->next = null;

delete node;

node = null;

}}int main()

return 0;

}

何海濤:

值得注意的是。為了讓**看起來簡潔一些,上面的**基於兩個如果:(1)給定的結點的確在鍊錶中。(2)給定的要刪除的結點不是鍊錶的頭結點。不考慮第乙個如果對**的魯棒性是有影響的。

至於第二個如果,當整個列表僅僅有乙個結點時,**會有問題。但這個如果不算非常過分。由於在有些鍊錶的實現中。會建立乙個虛擬的煉表頭,並非乙個實際的鍊錶結點。

這樣要刪除的結點就不可能是鍊錶的頭結點了。當然,在面試中,我們能夠把這些如果和面試官交流。這樣,面試官還是會認為我們考慮問題非常周到的。

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

給定乙個單鏈表中的表頭和乙個等待被刪除的節點 非表頭或表尾 請在在o 1 時間複雜度刪除該鍊錶節點。並在刪除該節點後,返回表頭。樣例 給定 1 2 3 4,和節點 3,返回 1 2 4。372 delete node in the middle of singly linked list 刪除鍊錶節...

谷歌面試題 在O(1)時間內刪除鍊錶節點

題目 給定鍊錶的頭指標和乙個結點指標,在o 1 時間刪除該結點。函式的宣告如下 void deletenode listnode plisthead,listnode ptobedeleted 分析 這是一道廣為流傳的google面試題,能有效考察我們的程式設計基本功,還能考察我們的反應速度,更重要...

面試題11 在O 1 時間刪除鍊錶結點

方法一 順序查詢要刪除的結點,並在鍊錶中刪除。時間複雜度為o n 不滿足題目要求 void deletenode listnode plisthead,listnode ptobedeleted else pcur m pnext ptobedeleted m pnext delete ptobed...