/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
 *
 * @param head ListNode类
 * @param m int整型
 * @param n int整型
 * @return ListNode类
 */
function reverseBetween(head, m, n) {
    // 当前下标
    let index = 0;
    // 结果
    let ans = head;
    let tree = new ListNode(0);
    // 记录截取初始位置(反转数组的上一个节点)
    let start;
    tree.next = head;
    while (index < m) {
        start = tree;
        tree = tree.next;
        ++index;
    }
    // 计数(因为要遍历边界,所以要减1)
    let cnt = index - 1;
    // 截取要反转的节点
    let list = new ListNode(0);
    list.next = tree;
    // 接收结果的节点列表
    let pre = new ListNode(0);
    // 记录结果列表的头节点
    let arr = pre;
    // 记录要拼接的后续节点
    let end;
    function getNode(cur) {
        if (cnt == n) {
            return;
        }
        if (cur == null || cur.next == null) {
            return;
        }
        ++cnt;
        // 指针向后指
        cur = cur.next;
        end = cur;
        getNode(cur);
        pre.next = new ListNode(0);
        pre = pre.next;
        pre.val = cur.val;
        return;
    }
    getNode(list);
    // 将反转数组的上一个节点和反转数组拼接
    start.next = arr.next;
    // console.log("arr:", arr);
    // console.log("start:", start);
    // 反转数组指针向后移
    while (arr.next) {
        arr = arr.next;
    }
    // 将反转数组和反转数组的下一个节点拼接
    if (end.next) {
        arr.next = end.next;
    }
    // 若截取左边界是1,则需要将start赋值给ans
    if (m == 1) {
        ans = start.next;
    }
    return ans;
}
module.exports = {
    reverseBetween: reverseBetween,
};