|
9 | 9 | * }
|
10 | 10 | */
|
11 | 11 | class Solution {
|
12 |
| - public ListNode reverseBetween(ListNode head, int left, int right) { |
13 |
| - ListNode prev = null; |
14 |
| - ListNode start = head; |
15 |
| - for (int i = 1; i < left; i++) { |
16 |
| - prev = start; |
17 |
| - start = start.next; |
| 12 | + public ListNode reverseBetween(ListNode head, int left, int right) { |
| 13 | + ListNode curr = head; |
| 14 | + ListNode prevToLeft = null; |
| 15 | + for (int i = 1; i < left; i++) { |
| 16 | + prevToLeft = curr; |
| 17 | + curr = curr.next; |
| 18 | + } |
| 19 | + ListNode nextToLeft = prevToLeft == null ? head : prevToLeft.next; |
| 20 | + for (int i = left; i < right; i++) { |
| 21 | + curr = curr.next; |
| 22 | + } |
| 23 | + ListNode nextToRight = curr.next; |
| 24 | + curr.next = null; |
| 25 | + if (prevToLeft != null) { |
| 26 | + prevToLeft.next = null; |
| 27 | + } |
| 28 | + ListNode reversedStart = reverse(nextToLeft); |
| 29 | + if (prevToLeft != null) { |
| 30 | + prevToLeft.next = reversedStart; |
| 31 | + } |
| 32 | + curr = reversedStart; |
| 33 | + while (curr.next != null) { |
| 34 | + curr = curr.next; |
| 35 | + } |
| 36 | + curr.next = nextToRight; |
| 37 | + return prevToLeft == null ? reversedStart : head; |
18 | 38 | }
|
19 |
| - ListNode end = start; |
20 |
| - for (int i = left; i < right; i++) { |
21 |
| - end = end.next; |
| 39 | + |
| 40 | + private ListNode reverse(ListNode head) { |
| 41 | + ListNode prev = null; |
| 42 | + ListNode curr = head; |
| 43 | + while (curr != null) { |
| 44 | + ListNode next = curr.next; |
| 45 | + curr.next = prev; |
| 46 | + prev = curr; |
| 47 | + curr = next; |
| 48 | + } |
| 49 | + return prev; |
22 | 50 | }
|
23 |
| - ListNode nextToEnd = end.next; |
24 |
| - end.next = null; |
25 |
| - ListNode reverseStart = reverse(start); |
26 |
| - if (prev != null) { |
27 |
| - prev.next = reverseStart; |
28 |
| - } |
29 |
| - ListNode curr = reverseStart; |
30 |
| - while (curr.next != null) { |
31 |
| - curr = curr.next; |
32 |
| - } |
33 |
| - curr.next = nextToEnd; |
34 |
| - return prev == null ? reverseStart : head; |
35 |
| - } |
36 |
| - |
37 |
| - private ListNode reverse(ListNode node) { |
38 |
| - ListNode prev = null; |
39 |
| - ListNode next = null; |
40 |
| - ListNode curr = node; |
41 |
| - while (curr != null) { |
42 |
| - next = curr.next; |
43 |
| - curr.next = prev; |
44 |
| - prev = curr; |
45 |
| - curr = next; |
46 |
| - } |
47 |
| - return prev; |
48 |
| - } |
49 | 51 | }
|
0 commit comments