力扣https://leetcode-cn.com/problems/reverse-linked-list-ii/
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
var reverseBetween = function(head, left, right) {
// 设置 dummyNode 是这一类问题的一般做法,使用虚拟头节点可以避免复杂的分类讨论
const dummy_node = new ListNode(-1);
dummy_node.next = head;
// 我们定义两个指针,分别称之为 g(guard 守卫) 和 p(point),这样初始化是有用意的
let g=dummy_node
let p=dummy_node.next
//将 g 移动到第一个要反转的节点的前面,将 p 移动到第一个要反转的节点的位置上
for(let i=0;i<left-1;i++){
g=g.next
p=p.next
}
// 循环需要反转的区间,将 p 后面的元素删除,然后添加到 g 的后面。也即头插法
for(i=0;i<right-left;i++){
let removedNode=p.next
p.next=p.next.next
removedNode.next=g.next
g.next=removedNode
}
//最后 返回 dummy_node.next
return dummy_node.next;
};