Skip to content

力扣链接:92.反转链表 II

难度:⭐⭐
- 推荐方法二

✏️ 方法一:

解题关键词:链表

解题思路:将指定区间内的元素入栈,之后逐个出栈。

typescript
function reverseBetween(
  head: ListNode | null,
  left: number,
  right: number
): ListNode | null {
  let count = 1;
  const stack = [];

  const preHead = new ListNode(-1, head);
  let slow = preHead;
  let fast = head;

  // 将两个指针一直往前移动
  while (count < left && fast) {
    count++;
    slow = slow.next;
    fast = fast.next;
  }

  // 此时肯定等于 left,如果不等于说明 left 大于了数组的长度
  if (count !== left) {
    return head;
  }

  // 入栈
  while (count <= right && fast) {
    stack.push(fast);
    fast = fast.next;
    count++;
  }

  // 出栈
  while (stack.length) {
    const target = stack.pop();
    slow.next = target;
    slow = slow.next;
  }

  slow.next = fast;

  return preHead.next;
}

✏️ 方法二:

解题关键词:链表

解题思路:遍历到区间中的元素,我们总是把后面的元素插到区间的最前面。

typescript
function reverseBetween(
  head: ListNode | null,
  left: number,
  right: number
): ListNode | null {
  const preHead = new ListNode(-1, head);

  let pre = preHead;

  // 将指针移动到区间起点左边的节点
  for (let i = 0; i < left - 1; i++) {
    pre = pre.next;
  }

  let cur = pre.next;

  // 不断插入到最前面
  for (let i = 0; i < right - left; i++) {
    const next = cur.next;
    cur.next = next.next;
    next.next = pre.next;
    pre.next = next;
  }

  return preHead.next;
}