Reverse nodes between indices
My solution:
public void reverseBetween(int m, int n) {
if (length <= 1) {
return;
}
Node left;
if (m == 0) {
left = new Node(0); // dummy
left.next = head;
} else {
int start = 0;
left = head;
while (start < m - 1) {
left = left.next;
start++;
}
}
Node prev = left;
Node cur = prev.next;
int reverseTimes = n - m + 1;
while (reverseTimes > 0 && cur != null) {
Node curNext = cur.next;
cur.next = prev;
prev = cur;
cur = curNext;
reverseTimes--;
System.out.println("length: " + length + ", reverseTimes: " + reverseTimes);
}
if (m == 0) {
head = prev;
Node last = left.next;
last.next = cur;
} else {
Node end = left.next;
end.next = cur;
left.next = prev;
}
}Better solution:
public void reverseBetween(int m, int n) {
if (length <= 1) {
return;
}
Node dummyNode = new Node(0);
dummyNode.next = head;
Node prev = dummyNode;
// moving the prev Node
for (int i = 0; i < m; i++) {
prev = prev.next;
}
Node cur = prev.next;
for (int i = 0; i < n - m; i++) {
Node toMove = cur.next;
cur.next = toMove.next;
toMove.next = prev.next;
prev.next = toMove;
}
head = dummyNode.next;
}- This is better because
- It just moves the nodes backwards