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

2021-08-03 14:26:13 字數 1250 閱讀 2730

struct listnode

;void deletenode(listnode **phead,listnode *pdelnode)

思路分析:單鏈表中刪除結點pdel的方法一般是遍歷鍊錶找到刪除結點的前乙個結點ppre,將ppre的next域指向pdel的下乙個結點再刪除pdel,這樣做可以達到刪除的要求但是不滿足題上所述的時間複雜度為o(1)的要求,那麼我們是不是一定要得到前乙個結點呢?我們可以將pdel的下乙個結點的內容覆蓋到pdel上,再把下乙個節點刪除,這樣就相當於刪除了 pdel結點,這種方法滿足了時間複雜度的問題,但是如果被刪除的結點在尾部沒有下乙個結點怎麼辦呢?,這個時候我們就需要從頭遍歷鍊錶,完成刪除操作,最後需要注意的是鍊錶中只有乙個結點時,刪除後要把頭結點置null。下面我們來看看具體的實現**。

#include

#include

typedef struct listnode

listnode;

void deletenode(listnode **phead,listnode *pdelnode)

else

if (*phead == pdelnode)//鍊錶中只有乙個節點

else

//鍊錶中有很多節點刪除尾結點

}void deltest()//測試函式

listnode* pdel = phead->_next->_next->_next;

listnode* ptail = phead;

while (ptail->_next)

ptail = ptail->_next;

listnode* phead1 =

null;

deletenode(&phead, phead);//刪除頭節點

deletenode(&phead, ptail);//刪除尾結點

deletenode(&phead, pdel);//刪除任意節點

deletenode(null, ptail);//特殊null測試

deletenode(&phead1, pdel);//鍊錶為空

deletenode(&phead, null);//刪除節點為空

}int main()

注意上述**,是基於刪除的結點在來鍊錶中的假設完成的,因為判斷結點是否在鍊錶中需要o(n)的時間,無法滿足題意的要求,這項工作可以交給函式的呼叫者自己處理。

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