天天看點

O(1)時間内删除指定連結清單結點

題目

給定單連結清單頭指針和一個結點指針,定義一個函數在O(1)時間内删除該結點。

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為傳值調用,傳到函數并沒有改變主函數中的值,圖示

O(1)時間内删除指定連結清單結點

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

本文轉自jihite部落格園部落格,原文連結:http://www.cnblogs.com/kaituorensheng/p/3603564.html,如需轉載請自行聯系原作者

繼續閱讀