/**
 * Reverse Nodes in k-Group
 * Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
 * If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
 * You may not alter the values in the nodes, only nodes itself may be changed.
 * Only constant memory is allowed.
 * For example,
 * Given this linked list: 1->2->3->4->5
 * For k = 2, you should return: 2->1->4->3->5
 * For k = 3, you should return: 3->2->1->4->5
 * @author chenshuna
 */
public class reverseKGroup {
    public static ListNode reverselist(ListNode pre,ListNode next){
        ListNode last=pre.next;
        ListNode cur=last.next;
        while(cur!=next){
            last.next=cur.next;
            cur.next=pre.next;
            pre.next=cur;
            cur=last.next;
        }
        return last;
    }
    
    public static ListNode reverseKGroup(ListNode head, int k) {
        if(head==null||head.next==null){
            return head;
        }
        ListNode newhead=new ListNode(0);
        newhead.next=head;
        ListNode pre=newhead;
        ListNode cur=head;
        int count=0;
        while(cur!=null){
            count++;
            ListNode next=cur.next;
            if(count==k){
                pre=reverselist(pre,next);
                count=0;
            }
            cur=next;
        }
        return newhead.next;
    }

    public static void main(String[] args) {
		// TODO Auto-generated method stub
        ListNode res = new ListNode(1);
        res.next = new ListNode(2);
        res.next.next =  new ListNode(3);
        res.next.next.next = new ListNode(4);
        res.next.next.next.next = new ListNode(5);
        ListNode display = reverseKGroup(res, 2);
        while(display != null){
            System.out.print(display.val);
            display = display.next;
        }
       
	}

}

/**
 * Reverse Nodes in k-Group
 * Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
 * If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
 * You may not alter the values in the nodes, only nodes itself may be changed.
 * Only constant memory is allowed.
 * For example,
 * Given this linked list: 1->2->3->4->5
 * For k = 2, you should return: 2->1->4->3->5
 * For k = 3, you should return: 3->2->1->4->5
 * @author chenshuna
 */
public class reverseKGroup {
    public static ListNode reverselist(ListNode pre,ListNode next){
        ListNode last = pre.next;
        ListNode cur = last.next;
        while(cur != next){
            last.next = cur.next;
            cur.next = pre.next;
            pre.next = cur;
            cur = last.next;
        }
        return last;
    }
    
    public static ListNode reverseKGroup(ListNode head, int k) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode newhead = new ListNode(0);
        newhead.next = head;
        ListNode pre = newhead;
        ListNode cur = head;
        int count = 0;
        while(cur != null){
            count++;
            ListNode next = cur.next;
            if(count == k){
                pre = reverselist(pre,next);
                count = 0;
            }
            cur = next;
        }
        return newhead.next;
    }

    public static void main(String[] args) {
        ListNode res = new ListNode(1);
        res.next = new ListNode(2);
        res.next.next =  new ListNode(3);
        res.next.next.next = new ListNode(4);
        res.next.next.next.next = new ListNode(5);
        ListNode display = reverseKGroup(res, 2);
        while(display != null){
            System.out.print(display.val);
            display = display.next;
        }
       
	}

}

fix bug