25. reverse nodes in k

explanation

  1. 以k为一组reverse
  2. helper 函数返回下一组的前一个
  3. 先reverse n1….nk reverser, 再处理n0->nk, n1->nk+1, 否则找不到n2

code

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
54

* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
// head : reverse的前一个
while(head != null) {
head = reverse(head, k);
}
return dummy.next;

}
// 如果不够k个,不reverse, return 一系列的前一个node
private ListNode reverse(ListNode head, int k) {
// 因为如果不够k个,不reverse, 所以要先判断有没有够k个,不能上来就reverse
// dummy 和nk 同时找到,n1 同时找到 nk+1
ListNode nk = head;
for (int i = 0; i < k; i++) {
nk = nk.next;
if (nk == null) {
return null;
}
}
ListNode n0 = head;
ListNode n1 = head.next;
ListNode nkplus = nk.next;
// now we have n0, n1,nk,nk+1;

ListNode prev, curt;
prev = n1;
// 如果先调整头尾顺序的话 curt = n1.next; 完全不对!!!
curt = n1.next;

// prev n1--nk-1
// curt n2 -- nk
for (int i = 1; i < k; i++) {
ListNode temp = curt.next;
curt.next = prev;
prev = curt;
curt = temp;
}
n0.next = nk;
n1.next = nkplus;
return n1;
}
}