携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
描述
给你一个链表的头节点 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 * 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
};