public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
     public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
        ListNode newHead = new ListNode(-1);
        newHead.next = head;
        if(head==null){
            System.out.println("{}");
            return null;
        }else{
            changeLink(newHead,k);
            return newHead.next;
        }
    }
    public void changeLink(ListNode newHead, int k){
        //从头开始遍历链表,使用双指针,间隔为k,当两个指针所指结点均不为空时,开始交换
        ListNode temp1=newHead;
        ListNode temp2=newHead;
        //首先将temp1移动到第k个结点。
        int index = 0;
        while (true){
            while (index<k && temp1!=null){
                temp1 = temp1.next;
                index++;
            }
            if(temp1!=null&&index==k){
                //这时开始交换temp1和temp2.next及之间的结点
                //temp1作为标志位,原地不动,
                //temp2从head向前挪,每挪一次,将新结点插入到头结点之后
                ListNode head = temp2;
                temp2 = temp2.next;
                ListNode node1;
                ListNode node2;
                while (head.next!=temp1){
                    //将temp2.next与head.next交换
                    node1 = head.next;
                    node2 = temp2.next.next;
                    head.next = temp2.next;
                    temp2.next = node2;
                    head.next.next = node1;


                }
            }else {
                break;
            }
            //第一组交换结束,下一组开始,此时应把index置零,将temp1与temp2移到下一组的前一个结点。
            temp1 = temp2;
            index = 0;
        }
    }
}