旋转链表|刷题打卡

102 阅读1分钟

每日算法 -- 链表

61. 旋转链表

61. 旋转链表

分析

  1. 先遍历一次求出链表的长度len,取余可以知道真正移动的步数 k
  2. 然后快慢指针求出旋转点的切点 prev,这是 prev 是旋转后的表尾,prev.next 是表头,需要注意的是,快指针走到 null 的时候,需要重新拼接到原始头指针
  3. 这个时候只需要保存新的头节点,然后将头尾节点打断,就可以得出新的链表了。
// 61. 旋转链表
// https://leetcode-cn.com/problems/rotate-list/

/**
 * @分析
 * 1. k 可能会比head 长,所以实际移动的是 k%len,其中 len 是链表的长度
 * 2.
 */
function rotateRight(head: ListNode | null, k: number): ListNode | null {
  if (!head) return head;
  let len = 0,
    temp = head;

  while (temp) {
    len++;
    temp = temp.next;
  }
  k %= len; // 实际要移动的长度

  let emptyNode = new ListNode();
  emptyNode.next = head;
  let prev = head;
  // 双指针求出移动后k+1那一段
  while (head && head.next) {
    if (k) {
      k--;
    } else {
      prev = prev.next;
    }
    head = head.next;
  }
  head.next = emptyNode.next;
  //   这个时候 prev.next 就是旋转后的投,prev 就是尾
  // 但是现在原始链表的头和尾还没有链接起来
  const res = prev.next;
  prev.next = null;

  return res;
}

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情