1. 首页

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
};

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:061. 旋转链表

链接:https://www.javascriptc.com/4421.html

« 062. 不同路径
前端nginx常用知识»
Flutter 中文教程资源

相关推荐

QR code