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;
}
}