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