forked from fishercoder1534/Leetcode
-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy path_206.java
More file actions
53 lines (47 loc) · 1.9 KB
/
_206.java
File metadata and controls
53 lines (47 loc) · 1.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.fishercoder.solutions;
import com.fishercoder.common.classes.ListNode;
/**
* 206. Reverse Linked List
*
* Reverse a singly linked list.*/
public class _206 {
/**creating a newHead = null is a very common/smart way to handle such cases, the logic flows out very naturally:
create a new node called "next" to hold current head's next node
then we could redirect head's next pointer to point to newHead which is head's previous node
the above two steps finished the reversion, to continue this process until we reach the end of the original list,
we'll assign current "head" to new "newHead", and current "next" to be new "head" for the next iteration, here's the code*/
public ListNode reverseList_iterative(ListNode head) {
/**It works out the best to set up a debug point and visualize this process:
* e.g. 1->2->3-null
* at the end of the first iteration of the while loop, the status is like this:
* newHead: 1->null
* head: 2->3-null
* then it continues the iteration.*/
ListNode newHead = null;
while (head != null) {
ListNode next = head.next;
head.next = newHead;
newHead = head;
head = next;
}
return newHead;
}
/**
* following the above iterative version, the recursive solution flows out so naturally, basically, we just replaced the while loop with a recursive function
* still, a null newHead proves to be very helpful.
*/
public ListNode reverseList_recursive(ListNode head) {
ListNode newHead = null;
return reverse(head, newHead);
}
ListNode reverse(ListNode head, ListNode newHead) {
if (head == null) {
return newHead;
}
ListNode next = head.next;
head.next = newHead;
newHead = head;
head = next;
return reverse(head, newHead);
}
}