题目介绍
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
示例1
输入: head = [1,2,3,4,5], k = 2
输出: [4,5,1,2,3]
示例2
输入: head = [0,1,2], k = 4
输出: [2,0,1]
提示:
- 链表中节点的数目在范围
[0, 500]
内 -100 <= Node.val <= 100
0 <= k <= 2 * 10^9
解题思路
此题由于移动的过程是循环的,即当 k 值大于链表的长度时,移动的过程会重复进行,所以我们应该取 k % n
(n为链表长度)来进行移动次数的计算,避免做无用功
1.定义 cur
指针,遍历链表,直到链表的尾指针,在遍历的过程中,同时记录链表的长度 n
2.将链表的尾节点指向链表的头节点,即形成一个闭环
3.计算 k % n
的值
4.从头节点开始往前走 n - k - 1
步,因为链表向右移动 k
个位置,类似于将环状链表从倒数第 k
个节点断开
5.记录当前节点的下一个节点为 head
,并且将当前节点指向 null
6.返回 head
,即为链表向右移动 k
个位置之后的链表
解题代码
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 个一组翻转链表