在O(1)時間刪除鍊錶某個結點

2021-09-17 04:31:58 字數 1253 閱讀 8451

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

struct listnode

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

第一思路:時間複雜度為o(n)的方法

從鍊錶的頭結點開始,順序遍歷查詢要刪除的結點,並在鍊錶中刪除該結點。時間複雜度為o(n)。其實這和陣列沒有什麼區別了,沒有充分利用鍊錶的特點。

**實現:

/**

* 定義單鏈表的結構體

* @author peter

*/public class listnode

//o(n)時間複雜度刪除pdelnode結點

public void deletenode1(listnode phead, listnode pdelnode)

if(phead == pdelnode)

//利用o(n)的時間複雜度刪除結點

for (listnode pnode = phead; pnode.next!=null; pnode = pnode.next)

}}

第二思路:在o(1)的時間複雜度刪除結點

因為從某個鍊錶的結點可以知道鍊錶的下乙個結點,故可以把下一結點的內容複製到需要刪除的結點上覆蓋原有的內容,再把下乙個結點刪除,就相當於把當前需要刪除的結點刪除。這是分為三種情況:刪除的結點不在鍊錶尾部;鍊錶只有乙個結點,刪除頭結點;鍊錶中有多個結點,刪除尾部結點。

**實現:

//o(1)時間刪除鍊錶的結點

public void deletenode(listnode phead, listnode pdelnode)

if(pdelnode.next!=null)else if(phead == pdelnode)else

pnode.next = null;

}}

時間複雜度分析:

對於n-1個非尾部結點而言刪除的時間複雜度為o(1),對於尾部結點刪除而言,仍然需要o(n)的時間複雜度。但是平均時間複雜度是:[ ( n - 1 ) * o( 1 ) + o( n ) ] / n,結果還是o(1)。

測試:

public static void main(string args) 

}

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

在O 1 時間刪除鍊錶結點

題目 題目 給定鍊錶的頭指標和乙個結點指標,在o 1 時間刪除該結點。思路 通常情況下,如果我們要刪除單鏈表的乙個節點,我們需要遍歷鍊錶找到這個節點的前乙個節點,然後執行刪除操作,時間複雜度為o n 我們試著換一種思路,事實上,我們可以從給定的結點得到它的下乙個結點。這個時候我們實際刪除的是它的下乙...