61. 旋转链表

给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

示例 1:

  1. 输入: 1->2->3->4->5->NULL, k = 2
  2. 输出: 4->5->1->2->3->NULL
  3. 解释:
  4. 向右旋转 1 步: 5->1->2->3->4->NULL
  5. 向右旋转 2 步: 4->5->1->2->3->NULL

示例 2:

输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL

思路

  1. 先过滤空链表
  2. 遍历一遍,获取链表长度。右移k个位置,相当于实际移动k % count 次,所有从链表头部开始遍历 count - k次
  3. 可以用一个链表指向该链表头部,这样就可以一次遍历完成链表指向,然后最后将链表尾部置空。

代码

/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var rotateRight = function(head, k) {
    if (!head) {
        return head;
    }
    let cur = head;
    let count = 1;
    while(cur.next) {
        cur = cur.next;
        count ++;
    }
    cur.next = head;
    let trueStep = count - (k % count);
    while(trueStep) {
        head = head.next;
        cur = cur.next;
        trueStep -= 1;
    }
    cur.next = null;
    return head
};

复杂度分析

时间复杂度 day7.[链表].61. 旋转链表 - 图1#card=math&code=O%28N%29)

空间复杂度 day7.[链表].61. 旋转链表 - 图2#card=math&code=O%281%29)