題目介紹
給我們一個鏈表,將這個鏈表的反轉過來。
示例:
輸入: 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指針指向首節點。
我們可以這樣思考,假如將head的下一個節點作爲方法的參數傳入,方法執行完,結果是將head.next作爲首節點的的鏈表反轉過來,如下圖。
這時將head爲首節點的鏈表反轉的問題就轉化了將head節點加入到以head.next爲首節點的鏈表中。這時我們只需要將head作爲val爲2的節點的next即可,並將head的next置爲null
。那麼怎麼找到val爲2的節點呢,通過上圖可以發現head.next就是val爲2的節點。
代碼:
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就是反轉後的鏈表
代碼:
public ListNode reverseList(ListNode head) {
ListNode newHead = null;
while(head != null){
ListNode tmp = head.next;
head.next = newHead;
newHead = head;
head = tmp;
}
return newHead;
}
總結
由於鏈表的數據結構的原因,所以鏈表的相關的題目非常適合遞歸和迭代的算法來思考,所以再遇到鏈表的相關題目,我們第一時間就要嘗試用遞歸或迭代的方法能否解決。