题解
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*
* 模拟
*
* 设置dummy节点,在头结点之前,模拟题意,进行k的倍数循环下去
* 将每次循环得到的子链进行翻转
*
* Code by java
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0); //创建一个节点dummy设置在头结点之前
dummy.next = head;
ListNode pre = dummy; //pre,end 指针从dummy出发
ListNode end = dummy;
while (end.next != null) {
for (int i = 0; i < k && end != null; i++) {
end = end.next;
}
if (end == null) break; //下面的步骤用于翻转子数组,最后没有到k的一段链表提前break,不翻转
ListNode start = pre.next; //start从pre指针的下一位开始,定为子链表的开头
ListNode next = end.next; //next是end(子链表的结尾)的下一位,用于确定下一个子链表的开头
end.next = null; //断链,让子链表独立出来,方便调用reverse方法
pre.next = reverse(start); //传入以start开头end结尾的链表,进行翻转,然后将新子链表与开头pre链接
start.next = next; //翻转后,start变成子链表的结尾,重新与后面的next链表连接
pre = start; //重新设置新的pre(dummy)和end
end = pre;
}
return dummy.next; //返回链表,即dummy的下一位为头结点的链表
}
//翻转数组
/*
* cur,head next
* 1 -> 2 -> 3 -> null
* cur pre
* 1 -> null
* cur,pre
* 1 -> null
* cur pre
* 2 -> 1 -> null
*/
private ListNode reverse(ListNode head) {
ListNode pre = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;
}
}