很简单的一道题,平时都是用迭代方法,这次难度主要在递归方法上
思路1:迭代
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//迭代方法
ListNode pre = null;
ListNode next = null;
while(head != null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
思路2:递归
下面是我自己写的
时间复杂度是O(n)
空间复杂度是栈的额外空间+O(n),额外生成了一个链表,浪费空间
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
ListNode pre = new ListNode(0);
public ListNode reverseList(ListNode head) {
//递归方法
ListNode h = pre;
reverse(head);
return h.next;
}
public void reverse(ListNode head){
if(head != null){
reverseList(head.next);
pre.next = new ListNode(head.val);
pre = pre.next;
}
}
}
看看真正的解法吧,简直太强了!!!
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//递归方法
if(head == null || head.next == null){
return head;
}
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
}