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

2021-09-26 08:58:13 字數 993 閱讀 6620

題目:

給定單向鍊錶的頭指標和乙個節點指標,定義乙個函式在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節點...