題目:
給定單向鍊錶的頭指標和乙個節點指標,定義乙個函式在o(1)時間內刪除該節點。鍊錶節點定義如下:
public class listnode
分析:
有三種情況:
要刪除的節點不是尾節點,時間複雜度為o(1)。
單鏈表中只有乙個節點,刪除頭節點,時間複雜度為o(1)。
單鏈表中有多個節點,要刪除的為尾節點,時間複雜度為o(n)。
針對第一種情況,採用如下步驟進行刪除。
找到該節點的下乙個節點。
將下乙個節點的值賦給該節點。
讓該節點的後繼指向下乙個節點的後繼。
針對第二種情況,直接置空即可。
針對第三種情況,需要整個鍊錶進行遍歷,所以時間複雜度是o(n)。
分析一下這個演算法的平均時間複雜度。對於n - 1個非尾節點而言,我們可以在o(1)時間內把下乙個節點的記憶體複製覆蓋要刪除的節點,標紅刪除下乙個節點;對於尾節點而言,由於仍然需要順序查詢,時間複雜度是o(n)。因此,總的平均時間複雜度為[(n - 1) * o(1) + o(n)] / n,結果還是o(1)。
**:
public class deletenode
//o(1)時間刪除鍊錶的節點
public void deletenode(listnode phead, listnode pdelnode)
//要刪除的節點不是尾節點,時間複雜度o(1)
if (pdelnode.next !=null)
//單鏈表中只有乙個節點,刪除頭節點,時間複雜度o(1)
else if (phead == pdelnode)
//單鏈表中有多個節點,要刪除的為尾節點,時間複雜度o(n)
else
pnode.next = null;}}
}
用O 1 的時間複雜度刪除單鏈表中的某個節點
給定鍊錶的頭指標和乙個結點指標,在o 1 時間刪除該結點。鍊錶結點的定義如下 definition for singly linked list.public class listnode 函式的宣告如下 void deletenode listnode plisthead,listnode pto...
用O 1 的時間複雜度刪除單鏈表中的某個節點
給定鍊錶的頭指標和乙個結點指標,在o 1 時間刪除該結點。鍊錶結點的定義如下 struct listnode 函式的宣告如下 void deletenode listnode plisthead,listnode ptobedeleted 這是一道廣為流傳的google面試題,考察我們對鍊錶的操作和...
資料結構 刪除單鏈表中p節點,時間複雜度O 1
在plist中刪除p節點,時間複雜度要求o 1 因為時間複雜度為o 1 所以常規思路遍歷鍊錶是不行的。刪除節點,其實是把該節點資料域清除,已知了p節點,那麼可以知道它的next節點,所以可以把p節點的下乙個節點的資料域賦值給p節點資料域,再讓p節點的next指向p next next,就實現了p節點...