206. 反轉鏈表

反轉單鏈表原地法與頭插法

單鏈表遍歷打印

我們先複習一下單鏈表遍歷打印

    public void printLink(){
        Node curNode = head;
        while(curNode !=null){
            System.out.print(curNode.data+" ");
            curNode = curNode.next;
        }
        System.out.println();
    }

單鏈表打印是用一個curNode單指針來判斷單鏈表是不是空,不是空,直接打印,後移,再判斷是不是空。
直到是空爲止,結束打印。

雙指針反轉單鏈表

這裏的"雙指針反轉單鏈表"是兩個指針prev和curr。prev指向前一個結點curr指向當前節點
微信截圖_20200302113740.jpg

微信截圖_20200302122253.jpg

    public ListNode reverseList(ListNode head) {
        //當前節點的前一個節點
        ListNode prev = null;
        //定義一個輔助指針幫我們遍歷原來的鏈表
        ListNode curr = head;
         while(curr!=null){
             //備份原來的節點
             ListNode nextTemp = curr.next;
             curr.next = prev;//指針反轉
             prev = curr;//前結點後移
             curr = nextTemp;//當前結點後移
         }
         return prev;
    }

關鍵是理解這兩步

curr.next = prev;
prev = curr;

這兩步,curr.next=prev其實可以對照實例想一下,2指向3的指針,指向了1。
就是說,指針原來從左右,就變爲了右左。
指針反轉就完了?不是的,我們只是把當前鏈表的指針向反轉了,新的鏈表的指針還沒有移動。
微信截圖_20200302124447.jpg
所以,我們要prev = curr,讓prev移動。
其實,這裏的prev是反轉後的鏈表的頭節點。注意了,這裏的頭結節可不是什麼輔助節點,是真真實實有數據的頭節點。
一定要根那種輔助頭區分開來。
理解了這兩步,我們就不斷的判斷curr指針是不是空,不斷的反轉就可以了。最後curr==null時,
我們就返回prev指針。
微信截圖_20200302125500.jpg

參考資料

反轉鏈表

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