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


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


codeType
输入:head = [0,1,2], k = 4
输出:[2,0,1]
提示:
- 链表中节点的数目在范围 [0, 500] 内
- -100 <= Node.val <= 100
- 0 <= k <= 2 * 109
解法:
ts
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function rotateRight(head: ListNode | null, k: number): ListNode | null {
if (head === null || head.next === null) {
return head;
}
// 不需要一个一个移动,先把链表变成一个循环链表
// 头节点移动 len - (k % len) 即可
const Dummy = new ListNode() // 哨兵节点
Dummy.next = head
let p = Dummy
let len = 0
// 计算链表长度
while(p.next !== null){
p = p.next
len++
}
// 把链表变成循环链表
p.next = head
// 计算旋转次数
let n = len - (k % len)
p = Dummy
for(let i = 0; i < n - 1; i++){ // 移动到新的末尾节点
p = p.next
}
head = p.next.next // 新的头节点
p.next.next = null // 断开末尾节点
return head
};