鍊錶:
typedef int datatype;
typedef struct node
node, *pnode, list, *plist;
我們知道在鍊錶中刪除乙個節點,最原始的方法就是講整個鍊錶遍歷一遍,遇到需要刪除的就將它刪除就可以,但是遍歷一遍鍊錶,其時間複雜度為o(n),但是題目中要求在o(1)時間內刪除鍊錶節點,我們的做法是:將需要刪除節點的下乙個節點的內容複製到需要刪除的節點,然後刪除需要刪除節點的下乙個節點,這樣就相當於將需要刪除節點刪除。如圖:
但是這樣的做法也有問題,如果需要刪除的節點是最後乙個節點,那麼它不存在下乙個節點,怎麼辦?我們任然從煉表頭開始遍歷,遍歷到最有乙個節點前的節點,然後進行刪除操作就可以了。
最後當鍊表中只有乙個節點,既是頭結點,也是尾節點,我們進行刪除操作之後,需要將頭指標指向null;
void deletenode(plist* pplist, plist pos)
//只有乙個節點(既是頭,又是尾)
else if (*pplist == pos)
//有多個節點,刪除尾節點
我們從頭開始遍歷鍊錶,如果乙個節點的內容和下乙個節點的內容一樣,我們就認為這兩個節點是重複節點,這樣的所有節點都要被刪除,在刪除後,為了讓鍊錶連在一起,我們需要確保將每次刪除後將這個節點的前乙個節點指向下乙個不是重複節點的節點。
如上圖:我們從頭開始遍歷,當遍歷到3的時候,讓(pre)指標指向2,3和4重複,我們刪除這四個節點,最後將(pre)指向5。
void deletesamenode(plist* pplist)
else
if (pre == null)//第乙個節點就是重複節點
else
pre->next = next;//pre指向下乙個不是重複節點的節點
} cur = next;
}}
刪除鍊錶中的節點
請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。現有乙個鍊錶 head 4,5,1,9 它可以表示為 4 5 1 9示例 1 輸入 head 4,5,1,9 node 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,...
刪除鍊錶中的節點
請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。現有乙個鍊錶 head 4,5,1,9 它可以表示為 4 5 1 9示例1 輸入 head 4,5,1,9 node 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該...
刪除鍊錶中的節點
請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。現有乙個鍊錶 head 4,5,1,9 它可以表示為 示例 1 輸入 head 4,5,1,9 node 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 ...