创见博客
旋转链表
七崽爱吃小饼干2026/01/07阅读 0专栏 算法合集

旋转链表

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