题目描述:
Reverse a singly linked list.
解题思路:
这个题有两种思路:递归和迭代,迭代相对于递归方式更加直观。
引入:算法中的自顶向下和自底向上
动态规划的实现分为两种,有递归和迭代。
递归一般是自顶向下,依赖于子问题优化函数的结果,只有子问题完全求出,也就是子问题的递归返回结果,原问题才能求解。
迭代法,就是巧妙的安排求解顺序,从最小的子问题开始,自下而上求解。每次求新的问题时,子问题的解已经计算出来了。
迭代法:
/**
* 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;
ListNode pre = head;
ListNode p = head.next;
pre.next = null;
ListNode nxt;
while(p!=null) {
nxt = p.next;
p.next = pre;
pre = p;
p = nxt;
}
return pre;
}
}
递归法:
/**
* 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) return null;
if(head.next==null) return head;
ListNode p = head.next;
ListNode n = reverseList(p);
head.next = null;
p.next = head;
return n;
}
}