import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
        ListNode result = new ListNode(1);
        result.next = head;
        ListNode left = result;
        ListNode cur = head;
        int len = 0;
	  // 先得到链表长度
        while(head != null) {
            head = head.next;
            len++;
        }
        for (int j = 0; j < len/k; j++) {
		  // 对数组分组进行部分反转
            for(int i = 1; i < k; ++i) {
			  // 依然和m n之间的节点反转法,使用头插的形式
			  // 前指针寻找cur的下一个
                ListNode temp = cur.next;
			  // 当前指针的下一个指向自己下一个node的下一个
                cur.next = temp.next;
			  // 下以一个node则要指向当前节点
                temp.next = left.next;
			  // 当前节点指向当前节点的下一个,则节点前插
                left.next = temp;
            }
		  // left到当前节点
            left = cur;
		  
		 // 因为当前节点已经到了反转数组的尾部,所以直接next
            cur = cur.next;
        }
        return result.next;
    }
}