encorehe学习手册-leetcode-92反转链表II

82 阅读1分钟

题目

给你单链表的头指针 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;
};