Leetcode-反轉鏈表

題目介紹

給我們一個鏈表,將這個鏈表的反轉過來。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

題解模板

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
    }
}

解題思路

遞歸解法

通過題解模板我們知道,傳入的是一個鏈表首節點,返回的是反轉鏈表後新的鏈表的首節點,並將其中的鏈表的順序反轉過來。
鏈表一開始的狀態如下,head指針指向首節點。
reverseLinkedlist_1.png
我們可以這樣思考,假如將head的下一個節點作爲方法的參數傳入,方法執行完,結果是將head.next作爲首節點的的鏈表反轉過來,如下圖。
reverseLinkedlist_2.png
這時將head爲首節點的鏈表反轉的問題就轉化了將head節點加入到以head.next爲首節點的鏈表中。這時我們只需要將head作爲val爲2的節點的next即可,並將head的next置爲null。那麼怎麼找到val爲2的節點呢,通過上圖可以發現head.next就是val爲2的節點。
reverseLinkedlist_3.png

代碼

public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }

迭代解法

我們假設反轉後的鏈表由newhead指向,那麼首先我們將newhead置爲null,那麼我們只需將原來鏈表的每個節點一次遍歷,並使用頭插法將每個節點插入到newhead中即可,返回的newhead就是反轉後的鏈表
reverseLinkedlist_4.png

代碼

public ListNode reverseList(ListNode head) {
        ListNode newHead = null;
        while(head != null){
            ListNode tmp =  head.next;
            head.next = newHead;
            newHead = head;
            head = tmp;
        }
        return newHead;
    }

總結

由於鏈表的數據結構的原因,所以鏈表的相關的題目非常適合遞歸和迭代的算法來思考,所以再遇到鏈表的相關題目,我們第一時間就要嘗試用遞歸或迭代的方法能否解決。

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