[路飞]Leetcode-61.旋转链表

110 阅读1分钟

题目描述

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

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

4 --> 5 --> 1 --> 2 --> 3
5 --> 1 --> 2 --> 3 --> 4
4 --> 5 --> 1 --> 2 --> 3

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

0 --> 1 --> 2
1 --> 2 --> 0
0 --> 1 --> 2
2 --> 0 --> 1

思路分析

将链表移动k个位置,我们可以采用使链表首位相连的一个小技巧,

首位相连后,向后推K个数据,然后再拆开,则就完成了链表旋转。

这里还有一个编程技巧(思维技巧),向后推k位,则我们应该从 n(总链表长度) - k的位置开始拆分

图示如下:

链表.gif

代码实现


/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var rotateRight = function (head, k) {
    let p = head;
    if (!head || !head.next) return head;
    let n = 1; 
    
    while(p.next) {
        p = p.next;
        n++;
    }
    
    p.next = head;
    let add = n - ( k % n);
    
    while(add) {
        p = p.next;
        add--
    }
    
    const ret = p.next;
    p.next = null;
    return p;
    
}