[路飞]_leetcode_61.旋转链表

105 阅读1分钟

思考

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

根据示例1: k = 2 的情况

当往链表往右移动以为的时候,实际上是链表尾节点,变成首节点,这样可以看出这个链表是循环的只是展示的位置不一样

解题思路

  1. 首先先将链表做出环形链表
  2. 根据移动的位置数,确定尾节点的位置。
    因为链表只能向后查找,所以我们可以根据节点个数和需要 k 个数获得尾节点位置
  3. 将尾节点指向null。

代码

var rotateRight = function(head, k) {
    if (!head) return head;
    let pre = tail = head, cnt = 1;
    while (pre.next) {
        pre = pre.next;
        cnt++;
    }
    // 做成环形链表
    pre.next = head;
    // 确定往后查找的位置
    cnt = cnt - k % cnt;
    while (--cnt) {
        tail = tail.next;
    }
    pre = tail.next;
    // 将尾节点指向空,形成非环形链表
    tail.next = null;
    return pre;
};