劍指Offer題目16:鏈表反轉(Java)

面試題16:定義一個函數,輸入一個鏈表的頭結點,反轉該鏈表並輸出反轉後鏈表的頭結點。面試

Basic

三指針向前推動法(自創詞彙方便記憶)bash

思路分析

因爲反向鏈表每一個節點時,須要切斷鏈表,此時就須要切口先後兩個Node holder: pre 和 next

能夠想象成一根繩子切成兩段,分別須要兩我的來牽住繩頭

左邊繩子須要牽住右端(逆序)

右邊繩子只需有人保住後面那段鏈表便可,所以右邊繩子牽住左端。

若是不找這兩我的來牽住各自兩邊的繩頭,切斷後的兩段鏈表就會丟失,只要沒有Holder,就被回收

同時須要從前日後遍歷下去,須要多一個移動指針 Node cur 收割者,從頭結點head開始收割
複製代碼

代碼實現

public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head == null) {
            return null;
        }
        if(head.next == null) {
            return head;
        }
        ListNode pre = null;
        ListNode next = null;
        ListNode cur = head;
        while(cur != null) {
            next = cur.next;//一、讓 next 小哥提早握住即將要切斷的右邊繩子的繩頭
            cur.next = pre;//二、把 cur 以後的繩子切斷,cur 的牽住的人從next哥換成pre妹子,此時完成左邊繩子的逆序
            pre = cur;//三、善後:爲了下一步繼續遍歷下去,須要讓 pre 往前右走一步,cur 把他握住的節點移交給pre妹子
            cur = next;//四、善後:左邊繩子的逆序徹底執行完畢,cur 小哥往右走一步,和 next 一塊兒牽住右段繩子的繩頭
            //此時 cur 收割者又準備收割下一個節點了!
        }
        return pre;//注意,pre 就至關於左邊逆序好的鏈表頭了
    }
}
複製代碼

相關文章
相關標籤/搜索