/*
* 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,
};