單鏈表反轉
阿新 • • 發佈:2020-12-28
1.什麼是連結串列的反轉?
當我在床上輾轉反側難以入睡的時候,我反過來翻過去的睡不著,想學習,於是想起了最近在看的反轉連結串列問題,這個還是需要一些思考哈。
首先當我們在聊到連結串列反轉的時候,一定說的都是單鏈表,雙鏈表本身就具有前驅指標 Prev 和後續指標 next,無需進行反轉哈。
單鏈表反轉,反轉後的效果如下:
看起來很簡單,只需要將單鏈表所有結點的 next 指向,指向它的前驅節點即可。
2.使用棧進行連結串列的反轉
引入一個棧結構(或者陣列),就可以實現。只是需要額外的空間,陣列的比較簡單,就是遍歷這個連結串列,將資料data用陣列存起來,再反向遍歷組成結點連線起來即可,這樣的話時間和空間複雜度均為n.
這裡以棧為例,在原本連結串列的資料結構之外,引入一個棧(陣列也可),將單鏈表迴圈遍歷,將所有結點入棧,最後再從棧中迴圈出棧,記住出棧的順序,得到的就是反轉後的單鏈表。
但是這樣實現,有一個問題,它會額外消耗一個棧的記憶體空間,此時空間複雜度就變成了 O(n)。並且,棧會遇到的問題,使用此種方式都會遇到,例如比較常見的,棧的深度問題。
2.原地反轉連結串列,空間複雜度降低
在排序演算法中,有一個概念叫原地排序,指的是不需要引入額外的儲存空間,在原資料結構的基礎上進行排序。這種排序演算法的空間複雜度是 O(1)。例如我們常見的氣泡排序、插入排序
都是原地排序演算法。
這裡,我們也可以在原單鏈表的資料結構上,進行單鏈表反轉。容易出錯的點在於,指標丟失,造成斷鏈。在轉換結點指標的時候,所需結點和指標反轉順序,都很重要,一不小心,就會丟掉原本的後續指標 next,導致連結串列斷裂。
在
https://www.javazhiyin.com/32787.html