给你一个链表的头节点 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
};