public ListNode reverseEvenLengthGroups(ListNode root) {
        int len = 1;
        ListNode ans = new ListNode();
        ans.next = root;
        int i = 0;
        ListNode last = root;
        while (root != null) {
            ListNode head = root;
            ListNode pre = head;
            while (head != null && i < len) {
                pre = head;
                head = head.next;
                i++;
            }
            if (i % 2 == 0) {
                ListNode[] tuple = reverse(root, last, i);
                root = tuple[0];
                last = tuple[1];
            }else{
                last = pre;
                root = head;
            }
            len++;
            i = 0;
        }
        return ans.next;
    }

    public ListNode[] reverse(ListNode root,ListNode last, int len) {
        int i = 0;
        ListNode tail = root;
        ListNode head = root;
        root = root.next;
        i++;
        while (root != null && i < len) {
            ListNode temp = root;
            root = root.next;
            temp.next = head;
            head = temp;
            i++;
        }
        last.next = head;
        tail.next = root;
        return new ListNode[]{root, last};
    }