Question:
Reverse a singly linked list.
Hint: A linked list can be reversed either iteratively or recursively.
Could you implement both?
My solution (recursion): 1ms
/**
* 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 head;
}
ListNode newHead = reverse(head,head.next);
head.next = null;
return newHead;
}
public ListNode reverse(ListNode src, ListNode next){
if(next == null){
return src;
}
ListNode newHead = reverse(next,next.next);
next.next = src;
return newHead;
}
}
My solution 2 :Memory Limit Exceeded in LeetCode System, but it can do with eclipse.
/**
* 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 head;
}
LinkedList<ListNode> list = new LinkedList<ListNode>();
list.push(head);
while(head.next != null){
list.push(head.next);
head = head.next;
}
head = list.pop();
ListNode tail = head;
while(list.size()>0){
tail.next = list.pop();
tail = tail.next;
}
return head;
}
}
Net solution : 0ms,1ms
Excellent !!!
// iterative solution
public ListNode reverseList(ListNode head) {
ListNode newHead = null;
while(head != null){
ListNode next = head.next;
head.next = newHead;
newHead = head;
head = next;
}
return newHead;
}
// recursive solution
public ListNode reverseList(ListNode head) {
return reverseListInt(head, null);
}
public ListNode reverseListInt(ListNode head, ListNode newHead) {
if(head == null)
return newHead;
ListNode next = head.next;
head.next = newHead;
return reverseListInt(next, head);
}