给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
/**
* 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 {
//为了处理 k>=n 的情况,需要获取 length,再对 k 取模
//直接将倒数第 k 个作为 head,第 k 个到最后的那个节点的 next 直接接上原来的 head
//首先定位到第 k 个,可以利用之前删除倒数第 n 个节点的思路,快慢指针
if(k===0 || !head || !head.next) return head
const dommy = new ListNode(0,head)
let length = 0
let curr = head
while(curr){
length ++
curr = curr.next
}
k = k % length
if(k === 0) return head. //边界情况需要注意,k 为 0 说明没有移动
let slow = dommy
let fast= dommy
for(let i = 0;i<k;i++){
fast=fast.next
}
while(fast && fast.next){
fast = fast.next
slow = slow.next
}
//此时slow为倒数第 k 个节点的前驱节点
dommy.next = slow.next
slow.next = null
fast.next = head
return dommy.next
};