给你一个链表的头节点 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]
题解
解题思路
根据给定题意,链表可能为空,k 可能为0,所以我们要特判一下如果链表为空或者k=0,直接返回头节点即可 获取链表长度 len,如果 k是 len 的整数倍,那么我们其实是不需要对链表进行翻转的,否则将 k 对 len 取余,即我们需要翻转的次数 将链表连成环 找到拆环的位置,获取拆环后的头节点,然后拆环,返回头节点即可
var rotateRight = function(head, k) {
let len = 0;
let linkHead = head;
if (!head || !k ) return head;
let prev = null;
// 获取链表长度
while(head) {
len++;
head.prev = prev;
prev = head;
head = head.next;
}
let linkLast = prev;
k = k % len;
// k 如果为长度整数倍,无需操作
if (k === 0) return linkHead;
// 连成环
while(k > 1) {
prev = prev.prev;
k--;
}
linkLast.next = linkHead;
prev.prev.next = null;
return prev;
};