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
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
if (head == null || head.next == null) {
return head;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy, ptr = dummy;
for (int i = 0; i < right - left + 2; i++) {
ptr = ptr.next;
}
for (int i = 0; i < left - 1; i++) {
prev = prev.next;
ptr = ptr.next;
}
ListNode start = prev.next;
prev.next = reverse(start, right - left + 1);
start.next = ptr;
return dummy.next;
}

private ListNode reverse(ListNode node, int steps) {
ListNode prev = null, curr = node;
for (int i = 0; i < steps; i++) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}

需要sentinel node以及reverse node就行了. 这里reverse node要reverse一定个数的, 不能全reverse完, 要reverse一定的数量.

时间复杂度: O(n)
空间复杂度: O(1)