题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
/*
* 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) {
const virtualHead = new ListNode(0);
virtualHead.next = head;
let pre = virtualHead,
cur = null;
// pre 前面不动的结点区域
// 题目的结点顺序下标是从1开始的,这里需要移动到不动结点的最后一个位置,也就是m的前一个位置
for (let i = 1; i < m; i++) {
pre = pre.next;
}
// 开始需要反转的结点
cur = pre.next;
// 需要反转的循环次数
for(let i = 0; i < n - m; i++) {
// 利用一个临时变量完成两个结点的反转
const temp = cur.next;
// 当前结点指向下下个结点(跳过临时结点)
cur.next = cur.next.next;
// temp的下一个结点是前面不动结点的下一个结点(注意这里并不是cur)
temp.next = pre.next;
// 前面不动的区域的下一个结点是当前这个临时结点
pre.next = temp;
// 经过上面的交换就完成了结点顺连,并且cur还完成了下移
}
return virtualHead.next;
}
module.exports = {
reverseBetween: reverseBetween,
};
下面给出图解:

