题目
给你单链表的头指针 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。
示例 1:
输入: head = [1,2,3,4,5], left = 2, right = 4
输出: [1,4,3,2,5]
示例 2:
输入: head = [5], left = 1, right = 1
输出: [5]
提示:
- 链表中节点数目为
n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
解题方式
var reverseBetween = function(head, left, right) {
// 构造哨兵节点
const shaobing = new ListNode(0, head);
// 哨兵指向头节点
// shaobing.next = this.head;
// 指针就位
let gurad = shaobing;
let prev = gurad.next;
// 两个指针向右走 满足 prev就指在 m gurad指在 m的前一个 (同步向右移动)
let len = left - 1;
for (let i = 0; i < len; i++) {
gurad = gurad.next; // gurad指针指向1
prev = prev.next; // prev右指针指向2
}
// 开始搞事情 把节点3断掉 放到2的前面 本来是在2的后面(即是头插入法)
let len1 = right - left;
for (let i = 0; i < len1; i++) {
const r = prev.next; // 刚开始 r是3
prev.next = prev.next.next;
r.next = gurad.next;
gurad.next = r;
}
return shaobing.next;
};