encorehe学习手册-leetcode-61. . 旋转链表

76 阅读1分钟

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

 

示例 1:

image.png

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

image.png

输入: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;

};