程式設計師面試寶典 33 在O 1 時間刪除鍊錶結點

2021-07-02 05:30:13 字數 841 閱讀 1884

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

struct listnode

;函式的宣告如下:

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

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

我們之所以需要從頭結點開始查詢要刪除的結點,是因為我們需要得到要刪除的結點的前面乙個結點。我們試著換一種思路。我們可以從給定的結點得到它的下乙個結點。這個時候我們實際刪除的是它的下乙個結點,由於我們已經得到實際刪除的結點的前面乙個結點,因此完全是可以實現的。當然,在刪除之前,我們需要需要把給定的結點的下乙個結點的資料拷貝到給定的結點中。此時,時間複雜度為o(1)。

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

/**

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

*@param phead 煉表頭結點

*@param ptobedeleted 要刪除的鍊錶結點

*@return

*/public listnode deletenode(listnode phead, listnode ptobedeleted) else

return phead;

}

棧在o 1 時間獲取最小元素

pop,push裡面都為o 1 這裡只有時間複雜度的要求,但是沒有空間複雜度的要求 思路1 原來的棧裡面只有乙個陣列,來存放所有的push值,現在,多乙個用來存放最小值得棧,如果新進元素的值比最小值棧裡面棧頂的元素要小,就push到最小值棧,其它情況不變。思路2 將放資料的單獨列出,放在乙個類裡面,...

在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 思路 在單向鍊錶中刪除乙個結點,最常用的做...