思路
将链表中前k个节点存入栈,再取出恰好可以实现每k个一组翻转,要注意临界条件:链表的最后一个节点放入之后,栈的大小小于k值。
代码

/**
 *
 * @param head ListNode类
 * @param k int整型
 * @return ListNode类
 */
public ListNode reverseKGroup (ListNode head, int k) {
    // write code here
    ListNode result;                
    ListNode key = new ListNode(0);     //初始化重构后的链表
    result=key;

    if(head==null||k<=0){               
        return null;
    }
    if (head.next==null){
        return head;
    }
    else {
        Stack<ListNode> stack = new Stack<ListNode>();   //创建栈存入前k个节点
        while (head!=null){
            for (int i=0;i<k;i++){
                stack.push(head);
                head=head.next;

                //当栈已经存满前k个节点
                if (stack.size()==k){
                    while (!stack.isEmpty()){          
                        ListNode node= new ListNode(stack.pop().val);
                        key.next=node;
                        key=key.next;
                    }
                }

                //当最后一个节点存入栈的大小仍然小于k
                if (head==null&&stack.size()!=k){
                    Stack<ListNode> queue = new Stack<>();
                    while (!stack.isEmpty()){
                        queue.add(stack.pop());
                    }
                    while (!queue.isEmpty()){
                        ListNode node= new ListNode(queue.pop().val);
                        key.next=node;
                        key=key.next;
                    }
                }
                break;     //跳出循环
            }
        }
    }
    return result.next;
}