[路飞]leetcode-61. 旋转链表

89 阅读1分钟

给你一个链表的头节点 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
};