每日編程19之二個精妙小算法

(1)求單鏈表的倒數第四個元素

第一種最直觀的想法是,用二個指針first,second;初始時second比first多三步,當second走到結尾時,first的位置就是倒數第四個元素

這個算法的優點是思想直觀,容易實現。但需要考慮鏈表元素個數少於4個節點的沒種情況。。

第二種較爲新穎的算法是,用一個數組arr[4]作爲輔助存儲,初始時arr中每個元素是一個特別的值,比如-1.01(最好能保證這個元素的唯一性,怎麼保證?)這種。。。依次遍歷鏈 表,將第4k+i個元素放入arr[i]。遍歷完鏈表後,若最後一個元素,爲4k+j,則(j+1)%4的值就是倒數第四個元素的值,若這個值是我們預定義的值,則說明鏈表元素少 於4個。。。

key:這個預定義的元素值怎麼取的問題,處理不好,這就是一個潛在的bug!!


(2)刪除無頭單鏈表的一個節點

也就是現在的輸入,只有待刪除的鏈表的節點指針,並沒有鏈表的表頭指針,因此無法對鏈表進行遍歷。。。

這裏的算法叫“狸貓換太子”:

也就是說,當前節點無論如何都沒法刪除,只能刪除它的下一個節點,但爲了保證刪除後鏈表結果的正確性,將當前節點的數據部分完全copy成它的下一個節點,然後刪除它的下一個節點。。OVER!

這裏的問題是,它的下一個節點必須不爲NULL,也就是說當前節點不能爲鏈表最後一個元素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章