【注释详细,思路清晰】【打卡第3天】leetcode热题HOT100之Java实现:61、旋转链表,给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

本文主要是介绍【注释详细,思路清晰】【打卡第3天】leetcode热题HOT100之Java实现:61、旋转链表,给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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]

2、算法分析

① 将链表的每个结点向右移动k个位置,关于k讨论如下:

     旋转链表,本质上就是将尾部向前数,第K个元素作为头部,原来的头部元素接在尾上
     至于往右移动,共有两种情况:
       1、K小于链表的长度
       2、K大于链表的长度
       相当于把链表后面的结点往前移动k % len个长度
       假如 k =2 len=4,那么k%len=2,链表尾部的元素向前移动2个长度
       假如 k =4 len=3,那么k%len=1, 链表尾部的元素向前移动1个元素
       所以:
       (1)求链表的长度
       (2)找出来倒数k+1个结点
       (3)将倒第k+1个结点和倒第k个结点断开,把链表的k+1包含k+1以后的结点拼接到链表的头部

②   图解:

3、代码实现

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*//*旋转链表,本质上就是将尾部向前数,第K个元素作为头部,原来的头部元素接在尾上至于往右移动,共有两种情况:1、K小于链表的长度2、K大于链表的长度相当于把链表后面的结点往前移动k % len个长度假如 k =2 len=4,那么k%len=2,链表尾部的元素向前移动2个长度假如 k =4 len=3,那么k%len=1, 链表尾部的元素向前移动1个元素所以:(1)求链表的长度(2)找出来倒数k+1个结点(3)将倒第k+1个结点和倒第k个结点断开,把链表的k+1包含k+1以后的结点拼接到链表的头部
*/
class Solution {public ListNode rotateRight(ListNode head, int k) {// 判断头结点是否存在,头结点下一个结点是否为空,返回头结点if(head == null || head.next == null){return head;}//定义链表初识长度为0int length = 0;// 定义p指针指向头结点ListNode p = head;// 求链表长度while(p != null){// p不为空,头结点长度也要算上length++;p = p.next;}// 计算偶棉结点移动的长度k = k % length;// 如果移动的位置为0,那么返回头结点if(k == 0){return head;}// 如果k>0的话,定义移动的长度位置,slow,fastListNode slow = head;ListNode fast = head;// 移动位置的范围长度while(k > 0){fast = fast.next;k--;}// 往后移动的条件,看fast条件while(fast != null && fast.next != null){// 范围端点往后移动slow = slow.next;fast = fast.next;}// 定义新的链表的头结点ListNode newHead = slow.next;// 新链表的尾结点设置为空slow.next = null;// 新链表 结点链接fast.next = head;return newHead;}
}

 

 

这篇关于【注释详细,思路清晰】【打卡第3天】leetcode热题HOT100之Java实现:61、旋转链表,给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/728116

相关文章

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Python3.6连接MySQL的详细步骤

《Python3.6连接MySQL的详细步骤》在现代Web开发和数据处理中,Python与数据库的交互是必不可少的一部分,MySQL作为最流行的开源关系型数据库管理系统之一,与Python的结合可以实... 目录环境准备安装python 3.6安装mysql安装pymysql库连接到MySQL建立连接执行S

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态