給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在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 我們試著換一種思路,事實上,我們可以從給定的結點得到它的下乙個結點。這個時候我們實際刪除的是它的下乙...