【路飞】算法与数据结构-旋转链表

103 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

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

示例 1:

rotate1.jpg

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

示例 2:

roate2.jpg

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
复制代码

提示:

  • 链表中节点的数目在范围 [0, 500] 内
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 109

思路

特判:空链表/只有一个节点的链表/移动步数为0 => 直接返回头结点 拿到链表总长度(待会会用到去计算实际移动的步数)& 连接成环形链表(尾节点指向头节点) 取模计算实际移动的步数move 根据move移动指针寻找截断点 保存截断点之后的点t(也就是新链表的头结点) 截断环形链表成普通链表 返回新链表的头结点

代码

var rotateRight = function(head, k) {
    if (!head || !head.next || !k) return head; //特判
    let len = 1, curr = head;
    while (curr.next) {
        curr = curr.next;
        len ++;//拿到链表总长度
    }
    curr.next = head; //连接成环形链表
    let move = len - (k % len);//取模计算实际移动的步数
    while (move) {
        curr = curr.next;//根据move移动指针寻找截断点
        move --;
    }
    let t = curr.next; //保存截断点之后的点t(也就是新链表的头结点)
    curr.next = null; //截断成普通链表 
    return t;//返回新链表的头结点
};

参考:leetcode-cn.com/problems/ro…