思路: 1.每K个反转,这个好实现。我们新建一个节点newHead ,初始化为-1,copy 出副本进行操作headPointer,每次遍历节点,它的next指向当前节点,方便下一次遍历的时候,下一个节点可以指向它。如果刚好到k了,那我们headPointer指向当前遍历周期开始的节点。主要是为了能够无缝衔接下一个周期节点。headPointer 主要是为了操作一个周期k个节点中,保存前一个节点,相当于反转链表的pre节点。 2.如果不足k个,我们已经反转了,那就需要再次反转一下。 多理解下


/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
        if(k<=0 || head == null){
            return head;
        }
        ListNode newHead = new ListNode(-1);
        ListNode currentNode = head;
        ListNode headPointer = newHead;
        while(true){
            int i = 0;
            ListNode nextStepNode = currentNode;
            ListNode next;
            while(i < k && currentNode != null){
                next = currentNode.next;
                currentNode.next = headPointer.next;
                headPointer.next = currentNode;
                currentNode = next;
                i++;
            }
            if(i == k){
                headPointer = nextStepNode;
            }else{
                for(currentNode = headPointer.next ,headPointer.next = null; currentNode != null;){
                    next = currentNode.next;
                    currentNode.next = headPointer.next;
                    headPointer.next = currentNode;
                    currentNode = next;
                }
                break;
            }
            
        }
        return newHead.next;
    }
}