LeetCode 61:旋转链表 Rotate List
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
Given a linked list, rotate the list to the right by k places, where k is non-negative.
示例 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
解题思路:
如果你看过上周的文章:LeetCode 189:旋转数组,和本篇文章旋转链表除了承载数据的结构变了,其他都一样,简单说一下
不断反转特定长度数组:
输入:1->2->3->4->5
反转整个数组: 5->4->3->2->1
拆分链表前k位为一段:5->4 , 3->2->1
反转前k位:4->5
反转剩余的:1->2->3
连接并输出: 4->5->1->2->3
按照这个思路,只需三次反转链表即可,而反转链表我们已经在文章 LeetCode 206:反转链表 中已经详细的介绍过了,用了迭代、递归两种方法,所以按照上述解该题的方法也可以用两种方法实现。
按上述思路解,与旋转数组那道题大同小异,来介绍另一种很简单高效的方法。
观察输入输出:
输入:1->2->3->4->5,k=2
输出:4->5->1->2->3在节点3后切断链表:1->2->3,4->5
将头节点连接到尾节点:4->5->1->2->3
输出:4->5->1->2->3
得益于链表的特性,明显这种方式更简单,而节点3的位置刚好就是 len-k (len为链表长度)。只需在第 len-k 个节点之后切断,首尾连接即可。
另外 k 可能大于链表长度,应当做求余运算 k=k%len 。考虑到切断的节点位置可能是最后一个节点,或者是位置 0 (即头节点前),明显不用做切断节点,但是按上述操作就会出现指针溢出报错,可以率先将首尾节点相连,组成环形链表。
Java:
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if (head == null || head.next == null || k == 0) return head;
int len = 1;
ListNode cur = head;
while (cur.next != null) {//计算链表长度
cur = cur.next;
len++;
}
cur.next = head;
int mod = len - k % len;//切断节点的位置
cur = head;
while (--mod > 0) cur = cur.next;//找到切断节点
ListNode newHead = cur.next;//新链表头节点
cur.next = null;//切断
return newHead;
}
}
Python3:
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if not head or not head.next or not k: return head
cur = head
len = 1
while cur.next:
len += 1
cur = cur.next
cur.next = head
cur = head
mod = len - k % len
while mod - 1 > 0:
cur = cur.next
mod -= 1
newHead = cur.next
cur.next = None
return newHead
欢迎关注微.信公.众号一起学习:爱写Bug

LeetCode 61:旋转链表 Rotate List的更多相关文章
- Java实现 LeetCode 61 旋转链表
61. 旋转链表 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = ...
- LeetCode 61. 旋转链表(Rotate List)
题目描述 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出 ...
- leetcode 61. 旋转链表
题目描述: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输 ...
- LeetCode 61——旋转链表(JAVA)
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4-& ...
- LeetCode 61——旋转链表
1. 题目 2. 解答 2.1. 方法一 将链表每个节点向右移动 1 个位置,其实就是让链表最后一个结点指向第一个结点. 因此,向右移动 k 个位置就重复上述过程 k 次即可. 然后,我们注意到,若链 ...
- LeetCode:旋转链表【61】
LeetCode:旋转链表[61] 题目描述 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5- ...
- leetcode网解题心得——61. 旋转链表
目录 leetcode网解题心得--61. 旋转链表 1.题目描述 2.算法分析: 3.用自然语言描述该算法 4.java语言实现 5.C语言实现 leetcode网解题心得--61. 旋转链表 1. ...
- 【LeetCode】61. 旋转链表
61. 旋转链表 知识点:链表: 题目描述 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置. 示例 输入:head = [1,2,3,4,5], k = 2 输出:[4 ...
- 61. 旋转链表-leetcode
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4-& ...
随机推荐
- Unity TextMeshPro 一键生成工具
本文参考了这片博客文章,在此基础上进行优化和改进: https://blog.csdn.net/akof1314/article/details/80868869 先截张效果图: TextMeshPr ...
- redis集群之Cluster
RedisCluster 是 Redis 的亲儿子,它是 Redis 作者自己提供的 Redis 集群化方案. 相对于 Codis 的不同,它是去中心化的,如图所示,该集群有三个 Redis 节点组成 ...
- C# - WinFrm应用程序MessageBox自动关闭小实验
概述 在程序中MessageBox弹出的对话框,用于向用户展示消息,这是一个模式窗口,可阻止应用程序中的其他操作,直到用户将其关闭.但是有时候在自动化程序中,如果弹出对话框,程序将会中断,等待人工的干 ...
- 关于ScriptManager.RegisterStartupScript 摘录
//ScriptManager.RegisterStartupScript 方法 (Control, Type, String, String, Boolean) public static void ...
- 总结了11条,我对Python 装饰器的理解
对于每一个学习 Python 的同学,想必对 @ 符号一定不陌生了,正如你所知, @ 符号是装饰器的语法糖,@符号后面的函数就是我们本文的主角:装饰器. 装饰器放在一个函数开始定义的地方,它就像一顶帽 ...
- Python爬虫反反爬:CSS反爬加密彻底破解!
刚开始搞爬虫的时候听到有人说爬虫是一场攻坚战,听的时候也没感觉到特别,但是经过了一段时间的练习之后,深以为然,每个网站不一样,每次爬取都是重新开始,所以,爬之前谁都不敢说会有什么结果. 前两天,应几个 ...
- SpringBoot(八) SpringBoot整合Kafka
window下安装kafka和zooker,超详细:https://blog.csdn.net/weixin_33446857/article/details/81982455 kafka:安装下载教 ...
- 【转载】如何在Android中避免创建不必要的对象
在编程开发中,内存的占用是我们经常要面对的现实,通常的内存调优的方向就是尽量减少内存的占用.这其中避免创建不必要的对象是一项重要的方面. Android设备不像PC那样有着足够大的内存,而且单个App ...
- Smobiler针对百度文字识别SDK动态编译与运行
下载百度ocr 在百度ocr平台下载android资源文档 文档地址:https://ai.baidu.com/docs#/OCR-Android-SDK/top sdk下载地址:http://ai. ...
- 关于MySQL的一些骚操作——提升正确性,抠点性能
概要 回顾以前写的项目,发现在规范的时候,还是可以做点骚操作的. 假使以后还有新的项目用到了MySQL,那么肯定是要实践一番的. 为了准备,创建测试数据表(建表语句中默认使用utf8mb4以及utf8 ...