给你一个链表的头节点 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个位置,因此可以将整个链表头尾相连,形成环形链表,找到正常移动后的头节点,再将头尾斩端,就形成了新的输出链表, 形成环形链表后,找到头节点,需要将环形链表旋转k次,就能获取到 长度为5,k为2环形链表旋转3次后节点为3,头节点就是中第二个节点的next 假如k为12,为了减少旋转的次数,可以取12%5=2作为旋转次数
链表头尾相连,只需遍历到最后一个链表将其next指向head节点 找到正常右移的头节点,假设为2,链表长度为5,头节点为5-(2%5)-1=3
var rotateRight = function(head, k) {
if(!head)return null
if(k==0)return head
let endNode=head
let size=1
while(endNode.next)endNode=endNode.next,size++
endNode.next=head
//旋转size
let len=size-(k%size)-1
for (let index = 0; index <len; index++) {
head=head.next
}
let cur=head.next
head.next=null
return cur
};