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