leetCode:61. 旋转链表

127 阅读1分钟

题目

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

解题思路

将链表连成环,每个节点向右移动k个节点,表示环形在长度为n的节点的尾节点成环后向右走n - k % n个节点,如果向右走的步数 = n,则表示不动,最后将标记的移动后的节点左右尾节点,断开即可

/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var rotateRight = function(head, k) {
    // 当只有一个或0个节点,或者移动步数为0时直接返回当前链表
    if(k === 0 || !head || !head.next) return head;

    // 找到尾结点,并记录数量
    let n = 1, curr = head;
    while(curr.next) {
        curr = curr.next;
        n++;
    }

    // 计算需要向右移动的步数
    let steps = n - k % n;
    if (steps === n) {
        return head;
    }

    // 将链表连接成环,然后向右走steps的步数,循环走完,表示curr节点就是结果链表的尾节点
    curr.next = head;
    while(steps) {
        curr = curr.next;
        steps--;
    }

    // 记录结果链表的头节点,然后断开头尾节点形成单行链表
    const start = curr.next;
    curr.next = null;
    return start;
};