题目
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k **个位置。
解题思路
将链表连成环,每个节点向右移动k个节点,表示环形在长度为n的节点的尾节点成环后向右走n - k % n个节点,如果向右走的步数 = n,则表示不动,最后将标记的移动后的节点左右尾节点,断开即可
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var rotateRight = function(head, k) {
// 当只有一个或0个节点,或者移动步数为0时直接返回当前链表
if(k === 0 || !head || !head.next) return head;
// 找到尾结点,并记录数量
let n = 1, curr = head;
while(curr.next) {
curr = curr.next;
n++;
}
// 计算需要向右移动的步数
let steps = n - k % n;
if (steps === n) {
return head;
}
// 将链表连接成环,然后向右走steps的步数,循环走完,表示curr节点就是结果链表的尾节点
curr.next = head;
while(steps) {
curr = curr.next;
steps--;
}
// 记录结果链表的头节点,然后断开头尾节点形成单行链表
const start = curr.next;
curr.next = null;
return start;
};