[路飞]_旋转链表

161 阅读1分钟

题目介绍

给你一个链表的头节点 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 * 10^9

leetcode-61 旋转链表
b站视频

解题思路

此题由于移动的过程是循环的,即当 k 值大于链表的长度时,移动的过程会重复进行,所以我们应该取 k % n(n为链表长度)来进行移动次数的计算,避免做无用功

1.定义 cur 指针,遍历链表,直到链表的尾指针,在遍历的过程中,同时记录链表的长度 n
2.将链表的尾节点指向链表的头节点,即形成一个闭环
3.计算 k % n 的值
4.从头节点开始往前走 n - k - 1 步,因为链表向右移动 k 个位置,类似于将环状链表从倒数第 k 个节点断开
5.记录当前节点的下一个节点为 head,并且将当前节点指向 null
6.返回 head,即为链表向右移动 k 个位置之后的链表

4.gif

解题代码

var rotateRight = function(head, k) {
    if (!head || !head.next || k === 0) return head
    let cur = head, n = 1
    while (cur.next) {
        cur = cur.next
        n++
    }
    cur.next = head
    k %= n
    let i = n - k 
    while (--i) {
        head = head.next
    }
    cur = head
    head = cur.next
    cur.next = null
    return head
};

以上就是本题的解题思路,可以查看我的其他文章
[路飞]_环形链表
[路飞]_环形链表II
[路飞]_快乐数
[路飞]_反转链表
[路飞]_反转链表II
[路飞]_K 个一组翻转链表