用JavaScript刷leetcode第61题-旋转链表

207 阅读1分钟

前言

想解这题很简单。
三步走:闭环 + 找尾 + 断尾。
代码可以千变万化,解题思想其实是固定的,就那么几种。

一、题目描述

leetcode地址
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例

输入: head = [1,2,3,4,5], k = 2
输出: [4,5,1,2,3]

二、解题

2.1 解题思路

关键思路已标出

  • 确定链表长度、链表尾节点
  • 链表尾节点连接链表头节点成环
  • 找到翻转后链表的尾巴
  • 移动len - k % n 步,即可找到尾巴
  • 保存翻转后的头,然后断尾,最后返回翻转后的头

2.2 代码

这个注释已经很详细了,记住三步走,代码可以千变万化,解题思想其实是固定的,就那么几种。

const rotateRight = function (head, k) {
  // 空链表、只用一个节点的链表、k = 0 时 不需要旋转
  if (head === null || head.next === null || k === 0) return head

  // 指针,遍历节点用
  let p = head
  // 链表长度
  let len = 1

  // 遍历确定链表长度,找到尾节点以连成环
  while(p.next !== null) {
    p = p.next
    len++
  }

  // 成环
  p.next = head

  // 确定p移动步长,得到新链表的尾巴,这里断环得到的就是翻转链表
  let move = len - k % len   // k可能大于链表长度,取余为右移距离

  while(move !== 0) {
    p = p.next
    move--
  }
  
  // 保存翻转链表头
  let newHead = p.next

  // 断尾
  p.next = null

  return newHead

}