/**

  • 关键思路:新的头结点 newNode, 新的头结点的标杆pointHead(方便最后返回结果)。 链表反转的时候反转前的节点 newHeadCur.
    利用List,反转的时候从尾部读取,不用反转的时候从头部读取。 */

import java.util.*;

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

public class Solution {

public ListNode reverseKGroup (ListNode head, int k) {
    // write code here
    List<ListNode> listNodes = new ArrayList<>();
    ListNode tempHead = head;

    ListNode newHead = new ListNode(0);
    // 记住起始位置
    ListNode pointHead = newHead;
    // 记录最后一个不为空的节点
    ListNode newHeadCur = null;

    while (head != null) {
        listNodes.add(head);
        head = head.next;
        if (listNodes.size() == k) {
            while (!listNodes.isEmpty()) {
                ListNode stackNode = listNodes.remove(listNodes.size() - 1);
                stackNode.next = null;
                newHeadCur = stackNode;
                newHead.next = stackNode;
                newHead = newHead.next;
            }
        }
    }
    if (pointHead.next == null) {
        return tempHead;
    }
    if (!listNodes.isEmpty()) {
        newHeadCur.next = listNodes.get(0);
    }
    return pointHead.next;
}


public static void main(String[] args) {
    Solution solution = new Solution();
    ListNode listNode1 = new ListNode(1);
    ListNode listNode2 = new ListNode(2);
    ListNode listNode3 = new ListNode(3);
    listNode1.next = listNode2;
    listNode2.next = listNode3;

    ListNode resNode = solution.reverseKGroup(listNode1, 2);
    System.out.println(resNode.val);
}

}