61. 旋转链表

闭合为环

解题思路

  1. 定义一个哨兵节点 dmg 指向 head ,迭代链表将 head 和尾部连接起来形成一个圆环,并获取链表的长度;

  2. dmg 向后移动 Math.abs((k % len) - len),如果 k > len 需要获得 k % len 旋转了几次,再减去 len 才是 dmg 需要移动的步数;

  3. 断开圆环,返回断开后的头节点

复杂度

  1. 时间复杂度:O(n),最坏情况下,需要遍历该链表两次;

  2. 空间复杂度:O(1)

代码实现

var rotateRight = function (head, k) {
    if (!head) return head;

    // 1. 定义一个哨兵节点指向 **head** ,迭代链表将 **head** 和尾部连接起来形成一个圆环,并获取链表的长度;
    let dmg = new ListNode(0, head)
    let tail = head;
    let len = 1;
    while (tail && tail.next) {
        tail = tail.next;
        len++;
    }
    tail.next = dmg.next;

    // 2. dmg 向后移动
    let count = Math.abs((k % len) - len);
    while (count--) {
        dmg = dmg.next
    }

    // 3. 断开圆环,返回断开后的头节点
    let h = dmg.next;
    dmg.next = null;

    return h;
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 闭合为环
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现