題目
給定單鏈表頭指標和乙個結點指標,定義乙個函式在o(1)時間內刪除該結點。
分析
對於上圖例項鍊錶(a)刪除指標p有兩種方式
於是,定位到思路2,但是思路2有兩個特例:
刪除的是尾指標,需要遍歷找到前乙個指標
整個鍊錶就乙個結點(屬於刪尾指標,但沒法找到前面的指標,需要開小灶單獨處理)
大體演算法思路
待刪指標不是尾指標:參考**待刪指標的值用待刪指標的下乙個指標的值覆蓋
刪掉待刪指標的下乙個指標
待刪指標是尾指標:
待刪指標同時是頭指標:
刪掉頭指標
待刪指標不是頭指標
找到待刪指標的前乙個指標
刪掉待刪指標,前乙個指標的next賦值為空
bool deletenode(listnode *&head, listnode *p)完整**1else
if(head ==p) //是尾指標,同時只有乙個結點
else //是尾指標,同時有多個結點
delete p;
p =null;
pre->m_pnext =null;
}return
true
;}
#include usingview codenamespace
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()
完整**2
#include usingview codenamespace
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()
分析
刪除非尾結點時間複雜讀為o(1),刪除尾結點的時間複雜讀為o(n), 平均時間複雜度為[(n-1)*o(1) + o(n)] / n = o(1)
還有刪除函式並不能處理待刪結點就是該鍊錶中的指標,因此需要人為呼叫時控制,如果得驗證的話,那就沒必要做這些處理了,直接o(n)
技術細節——傳值操作
#include using主函式中的指標head為傳值呼叫,傳到函式並沒有改變主函式中的值,圖示namespace
std;
struct
listnode
;void createlist(listnode *head)
void deletelist(listnode *p)
}int
main()
改進的措施就是引用傳值,直接操縱原指標。
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 ...