题目描述
给你一个链表的头节点 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的位置开始拆分
图示如下:
代码实现
/**
* @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;
}