leetcode-链表-61-旋转链表

149 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

描述

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

 

示例 1:

image.png 输入:head = [1,2,3,4,5], k = 2

输出:[4,5,1,2,3]

示例 2:

image.png

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

输出:[2,0,1]  

提示:

链表中节点的数目在范围 [0, 500] 内 -100 <= Node.val <= 100 0 <= k <= 2 * 109

思路

1.这道题我们采用双指针的方式进行解决,就是定义两个指针,一个快指针和一个慢指针

2.首先我们一起来看下这道题采用双指针方法的整体思路

3.整体思路就是定义了fast和slow两个指针,fast先走k步。当slow == fast 时,说明k会被链表长度整除,直接返回head即可。快慢指针同时移动,当快指针到达链表最后一项时,慢指针正好在链表需要打断的位置。

4.接下来我们一起详细的根据上面的思路开写一下思路

5.首先定义两个指针fase和slow,初始化分别执行头节点

6.首先将快指针fast先向右走k步,也就是将k一直减,当k一直存在的时候 将 fast指向fast的下一个节点

7.当快指针走完k步后,我们判断此时的快指针和慢指针是否相等,如果两个相等,则说明 k会被链表的长度整除,也就是整数倍,这个时候只需要返回head即可

8.当快指针和慢指针不相等的时候,我们将快指针和慢指针一起向右移动,直到快指针移动到末尾。这个时候 慢指针正好处于 打断链表的位置

9.这个时候 将 慢指针的位置进行打断,反转,最后返回head即可。

代码

var rotateRight = function (head, k) {
    let fast = head, slow = head
    // fast 先走k步
    while (k--) {
        if (fast && fast.next) fast = fast.next
        else fast = head
    }
    // slow == fast说明k会被链表长度整除,故无需操作head直接返回即可
    if (slow === fast) return head
    // 快慢指针start
    while (fast.next) {
        slow = slow.next
        fast = fast.next
    }
    // 对慢指针位置进行打断
    fast.next = head
    head = slow.next
    slow.next = null
    return head
};