前言
想解这题很简单。
三步走:闭环 + 找尾 + 断尾。
代码可以千变万化,解题思想其实是固定的,就那么几种。
一、题目描述
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
}