206. Reverse Linked List

Reverse a singly linked list.

解法一:迭代法(循環結構)Language-Java Run Time-0ms
解題思路:在對鏈表進行反轉的時候,需要更新每一個node的“next”值,但是,在更新 next 的值前,我們需要保存 next 的值,否則我們無法繼續。所以,我們需要兩個指針分別指向前一個節點和後一個節點,每次做完當前節點“next”值更新後,把兩個節點往下移,直到到達最後節點。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode next = null;
        //迭代
        while(head != null)
        {
            //保存當前節點的next域
            next = head.next;
            //更新當前節點的next域
            head.next = pre;
            //後移兩個指針
            pre = head;
            head = next;
        }
        return pre;
    }
}

解法二:遞歸法(選擇結構)Language-Java Run Time-1ms
解題思路:遞歸的方法利用遞歸走到鏈表的末端,然後再更新每一個node的next 值 。 在下面的代碼中, reverseRest 的值沒有改變,爲該鏈表的最後一個node。反轉後得到新鏈表的head。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null)
        {
            //返回當前節點
            return head;
        }
        //保存當前節點的next域
        ListNode next = head.next;
        //更新當前節點的next域爲null
        head.next = null;
        //反轉當前節點之後的所有節點。reverseRest 的值沒有改變,爲該鏈表的最後一個node
        ListNode reverseRest = reverseList(next);
        //更新每一個node的next值
        next.next = head;
        return reverseRest;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章