原文:61. 旋转链表(力扣 面试题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-061/

题目:

难度:Middle

相关话题:链表双指针

给定一个链表,旋转链表,将链表每个节点向右移动k 个位置,其中k 是非负数。

示例1:

输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL

示例2:

输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步:0->1->2->NULL
向右旋转 4 步:2->0->1->NULL

思路:

首先这个k是循环旋转的,因此,先找出实际需要旋转的次数realK=k % len

接着就是和NO.19相似了,找出倒数第realK个节点,并且将它连接头部。

定义双指针,其中指针2指针1n,等到指针1到达最后的时候,需要旋转的就是指针2.next

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var rotateRight = function(head, k) {
  let len=0
  let root=head
  while(root){
    root=root.next
    len++
  }
  if(len===0)return null
  let realK=k % len
  if(realK===0)return head

  let first=head,second=head
  while(realK-->0)first=first.next
  while(first && first.next){
    first=first.next
    second=second.next
  }
  let newHead=second.next
  first.next=head
  second.next=null
  return newHead
};

扩展阅读: