Reverse a singly linked list.
Don't forget to consider the case where the linked list is empty
Time: O(2N), Space: O(1)
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 public class Solution { 10 public ListNode reverseList(ListNode head) { 11 if (head == null) return null; 12 ListNode dummy = new ListNode(-1); 13 dummy.next = head; 14 ListNode end = dummy; 15 while (end.next != null) { 16 end = end.next; 17 } 18 while (dummy.next != end) { 19 ListNode cur = dummy.next; 20 ListNode next = cur.next; 21 cur.next = end.next; 22 end.next = cur; 23 dummy.next = next; 24 } 25 return dummy.next; 26 } 27 }
基本迭代
Time: O(N), Space: O(1)
1 public class Solution { 2 public ListNode reverseList(ListNode head) { 3 if(head == null || head.next == null) return head; 4 ListNode p1 = head; 5 ListNode p2 = p1.next; 6 while(p2 != null){ 7 ListNode tmp = p2.next; 8 p2.next = p1; 9 p1 = p2; 10 p2 = tmp; 11 } 12 head.next = null; 13 return p1; 14 } 15 }
基本递归
Time: O(N), Space: O(N)递归栈大小
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 public class Solution { 10 ListNode newHead; 11 12 public ListNode reverseList(ListNode head) { 13 reverse(head); 14 return newHead; 15 } 16 17 private ListNode reverse(ListNode n){ 18 if( n == null || n.next == null){ 19 newHead = n; 20 } else { 21 ListNode prev = reverse(n.next); 22 prev.next = n; 23 } 24 return n; 25 } 26 }