设置dummy
虚拟头节点,pre
为待翻转部分的前驱(用于连接),end
为待翻转部分中的结尾节点(用k
定),next
为待翻转部分的后续节点(用于连接),bg
为翻转前的翻转部分的开始节点,进入reverse
后,会有cur
节点作为副本,因此bg
的位置不会变,翻转后,bg
所在节点变成了结尾,将其和next
相连,reverse
返回的节点(新开始节点)和pre
相连。
pre
指向bg
,作为下一个待翻转部分的前驱。
end
指向pre
,从pre
出发数k
个节点。
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0, head);
ListNode pre = dummy, end = dummy;
while (end.next != null) {
for (int i = 0; i < k && end != null; ++i) end = end.next;
// 注意只要访问next节点,就要检查这个节点是否为空
if (end == null) break;
ListNode bg = pre.next;
ListNode nxt = end.next;
end.next = null;
pre.next = reverse(bg);
bg.next = nxt;
pre = bg;
end = pre;
}
return dummy.next;
}
private ListNode reverse(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode nxt = cur.next;
cur.next = pre;
pre = cur;
cur = nxt;
}
return pre;
}
}