O 1 時間內刪除指定鍊錶結點

2022-02-19 02:28:04 字數 2214 閱讀 4475

題目

給定單鏈表頭指標和乙個結點指標,定義乙個函式在o(1)時間內刪除該結點。

分析

對於上圖例項鍊錶(a)刪除指標p有兩種方式

於是,定位到思路2,但是思路2有兩個特例:

刪除的是尾指標,需要遍歷找到前乙個指標

整個鍊錶就乙個結點(屬於刪尾指標,但沒法找到前面的指標,需要開小灶單獨處理)

大體演算法思路

待刪指標不是尾指標:

待刪指標的值用待刪指標的下乙個指標的值覆蓋

刪掉待刪指標的下乙個指標

待刪指標是尾指標:

待刪指標同時是頭指標:

刪掉頭指標

待刪指標不是頭指標

找到待刪指標的前乙個指標

刪掉待刪指標,前乙個指標的next賦值為空

參考**

bool deletenode(listnode *&head, listnode *p)

else

if(head ==p) //是尾指標,同時只有乙個結點

else //是尾指標,同時有多個結點

delete p;

p =null;

pre->m_pnext =null;

}return

true

;}

完整**1

#include using

namespace

std;

struct

listnode

;bool deletenode(listnode *&head, listnode *p)

else

if(head ==p)

else

delete p;

p =null;

pre->m_pnext =null;

}return

true;}

void createlist(listnode *&head)

void deletelist(listnode *p)

}int

main()

view code

完整**2

#include using

namespace

std;

struct

listnode

;bool deletenode(listnode **head, listnode *p)

else

if(*head ==p)

else

delete p;

p =null;

pre->m_pnext =null;

}return

true;}

void createlist(listnode *&head)

void deletelist(listnode *p)

}int

main()

view code

分析

刪除非尾結點時間複雜讀為o(1),刪除尾結點的時間複雜讀為o(n), 平均時間複雜度為[(n-1)*o(1) + o(n)] / n = o(1)

還有刪除函式並不能處理待刪結點就是該鍊錶中的指標,因此需要人為呼叫時控制,如果得驗證的話,那就沒必要做這些處理了,直接o(n)

技術細節——傳值操作

#include using

namespace

std;

struct

listnode

;void createlist(listnode *head)

void deletelist(listnode *p)

}int

main()

主函式中的指標head為傳值呼叫,傳到函式並沒有改變主函式中的值,圖示

改進的措施就是引用傳值,直接操縱原指標。

O 1 時間內刪除指定鍊錶結點

題目 給定單鏈表頭指標和乙個結點指標,定義乙個函式在o 1 時間內刪除該結點。分析 對於上圖例項鍊錶 a 刪除指標p有兩種方式 於是,定位到思路2,但是思路2有兩個特例 刪除的是尾指標,需要遍歷找到前乙個指標 整個鍊錶就乙個結點 屬於刪尾指標,但沒法找到前面的指標,需要開小灶單獨處理 大體演算法思路...

程式設計題目 在 O(1)時間內刪除鍊錶結點

60.在 o 1 時間內刪除鍊錶結點 鍊錶 演算法 題目 給定鍊錶的頭指標和乙個結點指標,在 o 1 時間刪除該結點。鍊錶結點的定義如下 struct listnode 函式的宣告如下 void deletenode listnode plisthead,listnode ptobedeleted ...

程式設計題目 在 O(1)時間內刪除鍊錶結點

60.在 o 1 時間內刪除鍊錶結點 鍊錶 演算法 題目 給定鍊錶的頭指標和乙個結點指標,在 o 1 時間刪除該結點。鍊錶結點的定義如下 struct listnode 函式的宣告如下 void deletenode listnode plisthead,listnode ptobedeleted ...