題目
給定單連結清單頭指針和一個結點指針,定義一個函數在O(1)時間内删除該結點。
分析
對于上圖執行個體連結清單(a)删除指針p有兩種方式
思路1:(b)找到前一個指針pre,指派pre->next = p->next,删掉p
思路2:(c)目的是删除p,但是不删p,直接用p->next的值指派給p,把p->next删除掉(好處:不用周遊找到p的前一個指針pre,O(1)時間内搞定)
于是,定位到思路2,但是思路2有兩個特例:
删除的是尾指針,需要周遊找到前一個指針
整個連結清單就一個結點(屬于删尾指針,但沒法找到前面的指針,需要開小竈單獨處理)
大體算法思路
<a></a>
參考代碼
完整代碼1
View Code
完整代碼2
删除非尾結點時間複雜讀為O(1),删除尾結點的時間複雜讀為O(n), 平均時間複雜度為[(n-1)*O(1) + O(N)] / N = O(1)
還有删除函數并不能處理待删結點就是該連結清單中的指針,是以需要人為調用時控制,如果得驗證的話,那就沒必要做這些處理了,直接O(N)
技術細節——傳值操作
主函數中的指針head為傳值調用,傳到函數并沒有改變主函數中的值,圖示
改進的措施就是引用傳值,直接操縱原指針。
本文轉自jihite部落格園部落格,原文連結:http://www.cnblogs.com/kaituorensheng/p/3603564.html,如需轉載請自行聯系原作者