Skip to content

Commit 57b5bcd

Browse files
refactor 92
1 parent ef6c033 commit 57b5bcd

File tree

1 file changed

+40
-114
lines changed
  • src/main/java/com/fishercoder/solutions

1 file changed

+40
-114
lines changed
Lines changed: 40 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,49 @@
11
package com.fishercoder.solutions;
22

33
import com.fishercoder.common.classes.ListNode;
4-
import com.fishercoder.common.utils.CommonUtils;
54

6-
/**Reverse a linked list from position m to n. Do it in-place and in one-pass.
7-
8-
For example:
9-
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
10-
11-
return 1->4->3->2->5->NULL.
12-
13-
Note:
14-
Given m, n satisfy the following condition:
15-
1 ≤ m ≤ n ≤ length of list.*/
5+
/**
6+
* 92. Reverse Linked List II
7+
*
8+
* Reverse a linked list from position m to n. Do it in-place and in one-pass.
9+
*
10+
* For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4,
11+
*
12+
* return 1->4->3->2->5->NULL.
13+
*
14+
* Note: Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.
15+
*/
1616
public class _92 {
1717

18-
// then I turned to Discuss and find this most upvoted solution:
19-
// https://discuss.leetcode.com/topic/8976/simple-java-solution-with-clear-explanation, it's
20-
// indeed concise, I knew there's such a solution there
21-
public ListNode reverseBetween_concise_version(ListNode head, int m, int n) {
22-
// use four nodes, pre, start, then, dummy
23-
// just reverse the nodes along the way
24-
ListNode dummy = new ListNode(-1);
25-
dummy.next = head;
26-
ListNode pre = dummy;
27-
for (int i = 0; i < m - 1; i++) {
28-
pre = pre.next;
29-
}
30-
31-
ListNode start = pre.next;// start is the node prior to reversing, in the given example,
32-
// start is node with value 1
33-
ListNode then = start.next;// then is the node that we'll start to reverse, in the given
34-
// example, it's 2
35-
36-
for (int i = 0; i < n - m; i++) {
37-
// pay special attention to this for loop, it's assigning then.next to start.next, it
38-
// didn't initialize a new node
39-
// this does exactly what I desired to do, but I just didn't figure out how to implement
40-
// it, thumbs up to the OP!
41-
start.next = then.next;
42-
then.next = pre.next;
43-
pre.next = then;
44-
then = start.next;
45-
}
46-
47-
return dummy.next;
48-
}
49-
18+
public static class Solution1 {
19+
/** credit: https://discuss.leetcode.com/topic/8976/simple-java-solution-with-clear-explanation */
5020
public ListNode reverseBetween(ListNode head, int m, int n) {
51-
// find node at position m, let's call it "revHead"
52-
// set its previous node as "newRevHead", then start processing until we reach node at
53-
// position n
54-
ListNode newRevHead = null;
55-
ListNode revHead = head;
56-
ListNode pre = new ListNode(-1);
57-
pre.next = head;
58-
if (m > 1) {
59-
int mCnt = 1;
60-
while (mCnt++ < m) {
61-
newRevHead = revHead;
62-
revHead = revHead.next;
63-
}
64-
}
65-
ListNode nodePriorToM = newRevHead;
66-
67-
// iteratively
68-
int nCnt = m;
69-
ListNode next = null;
70-
while (nCnt <= n) {
71-
next = revHead.next;
72-
revHead.next = newRevHead;
73-
newRevHead = revHead;
74-
revHead = next;
75-
nCnt++;
76-
}
77-
78-
if (nCnt > n) {
79-
nCnt--;
80-
}
81-
// append next to the tail of the reversed part
82-
ListNode reversedPart = newRevHead;
83-
if (reversedPart != null) {
84-
while (nCnt > m) {
85-
reversedPart = reversedPart.next;
86-
nCnt--;
87-
}
88-
reversedPart.next = next;
89-
}
90-
91-
// append the reversed part head to the node at position m-1
92-
if (nodePriorToM != null) {
93-
nodePriorToM.next = newRevHead;
94-
} else {
95-
pre.next = newRevHead;
96-
}
97-
98-
return pre.next;
21+
// use four nodes, pre, start, then, dummy
22+
// just reverse the nodes along the way
23+
ListNode dummy = new ListNode(-1);
24+
dummy.next = head;
25+
ListNode pre = dummy;
26+
for (int i = 0; i < m - 1; i++) {
27+
pre = pre.next;
28+
}
29+
30+
ListNode start = pre.next;// start is the node prior to reversing, in the given example,
31+
// start is node with value 1
32+
ListNode then = start.next;// then is the node that we'll start to reverse, in the given
33+
// example, it's 2
34+
35+
for (int i = 0; i < n - m; i++) {
36+
// pay special attention to this for loop, it's assigning then.next to start.next, it
37+
// didn't initialize a new node
38+
// this does exactly what I desired to do, but I just didn't figure out how to implement
39+
// it, thumbs up to the OP!
40+
start.next = then.next;
41+
then.next = pre.next;
42+
pre.next = then;
43+
then = start.next;
44+
}
45+
46+
return dummy.next;
9947
}
100-
101-
public static void main(String... strings) {
102-
_92 test = new _92();
103-
// ListNode head = new ListNode(1);
104-
// head.next = new ListNode(2);
105-
// head.next.next = new ListNode(3);
106-
// head.next.next.next = new ListNode(4);
107-
// head.next.next.next.next = new ListNode(5);
108-
// int m = 2, n =4;
109-
110-
// ListNode head = new ListNode(5);
111-
// int m = 1, n =1;
112-
113-
ListNode head = new ListNode(3);
114-
head.next = new ListNode(5);
115-
int m = 1;
116-
int n = 2;
117-
118-
CommonUtils.printList(head);
119-
ListNode result = test.reverseBetween(head, m, n);
120-
CommonUtils.printList(result);
121-
}
122-
48+
}
12349
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy