力扣61(java&python)-旋转链表(中等)
题目:
给你一个链表的头节点 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]
提示:
- 链表中节点的数目在范围
[0, 500]内 -100 <= Node.val <= 1000 <= k <= 2 * 109
解题思路:
快慢指针+闭环
整体思路:找到倒数第k个结点的前一个结点,然后让链表的尾结点连接首结点形成闭环,然后倒数第k个结点是新链表的头结点,它之前的前一个结点作为链表的尾结点。
具体思路(结合例子):
1.定义慢指针slow和快指针fast,初始都指向链表的头结点;

2.让快指针走到链表的尾结点处,计算出链表的长度len,将尾结点指向head形成闭环;

3.计算出慢指针需要移动的步数step,移动慢指针,移动step - 1步,使慢指针在倒数第k个结点的前一个结点;

4.保存慢指针slow的下一个结点,作为新链表的头结点,并断开它与下一个结点的联系,使其指向空,让它作为新链表的尾结点;

5.返回新的头结点即可。

注解:
1.len从1开始:因为快指针初始化的时候就在头结点上,因此长度初始值就应该为1。
2.对下断代码的解释:结合上面的例子,算出来的slow的步数step=5,但是实际slow只移动4步,因为链表是环形,需要把结点4和结点4的前一个结点断开,但是不清楚结点4的前一个结点是谁,故这里就少移动一步,指向结点3,并保存结点4,方便后面断开3和4的联系。
while(step-- > 1){
slow = slow.next;
}
java代码:
1 /**
2 * Definition for singly-linked list.
3 * public class ListNode {
4 * int val;
5 * ListNode next;
6 * ListNode() {}
7 * ListNode(int val) { this.val = val; }
8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
9 * }
10 */
11 class Solution {
12 public ListNode rotateRight(ListNode head, int k) {
13 //特判
14 if(head == null || k == 0) return head;
15 int len = 1;
16 ListNode fast = head, slow = head;
17 //计算链表长度
18 while(fast.next != null){
19 len++;
20 fast = fast.next;
21 }
22 //将链表变成环
23 fast.next = head;
24 //计算出慢指针需要移动的步数
25 int step = len - k%len;
26 while(step-- > 1){
27 slow = slow.next;
28 }
29 //保存慢指针的下一个结点(新的头结点)
30 ListNode newHead = slow.next;
31 //断开闭环
32 slow.next = null;
33 return newHead;
34 }
35 }

python3代码:
1 # Definition for singly-linked list.
2 # class ListNode:
3 # def __init__(self, val=0, next=None):
4 # self.val = val
5 # self.next = next
6 class Solution:
7 def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
8 # 特判当k为0或者链表长度为0或1
9 if not head or not head.next or k == 0:
10 return head
11 # 定义快慢指针和长度
12 fast, slow = head, head
13 len = 1
14 # 计算链表长度
15 while fast.next:
16 len += 1
17 fast = fast.next
18
19 #形成闭环
20 fast.next = head
21
22 # 移动慢指针
23 step = len - k%len - 1
24 # 条件是当step为0停止循环,故step要先减1
25 while step:
26 slow = slow.next
27 step -= 1
28 # 保存当前慢指针等下一个结点作为新的头结点
29 newHead = slow.next
30 slow.next = None
31 return newHead

力扣61(java&python)-旋转链表(中等)的更多相关文章
- 力扣—Reorder List(重排链表)python实现
题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...
- 力扣——Partition List(分隔链表) python实现
题目描述: 中文: 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = ...
- 【力扣】82. 删除排序链表中的重复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序排列的结果链表. 示例 1: 输入:hea ...
- LeetCode(61):旋转链表
Medium! 题目描述: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, ...
- [LeetCode] 61. Rotate List 旋转链表
Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: I ...
- [leetcode]61. Rotate List旋转链表
Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: I ...
- leetCode 61.Rotate List (旋转链表) 解题思路和方法
Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. For ex ...
- 力扣(LeetCode)反转链表 个人题解
反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶:你可以迭代或 ...
- 力扣(LeetCode)旋转字符串 个人题解
给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...
- 力扣(LeetCode)环形链表 个人题解
给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入: ...
随机推荐
- k8s资源管理中request和limit的区别
在 Kubernetes(K8s)中,request和limit是两个重要的概念,用于控制和管理容器的资源使用. Request(请求): request定义了容器启动时需要保证的最小资源量.这表示K ...
- dbvisualizer之编辑区中文乱码问题
!在SQL Commander中,sql语句中如果有中文,显示是'口口口'. 解决办法如下: 在Tools->tool Properties->General->Appearance ...
- jsp转换成html
相信很多人都希望自己的页面越快越好,最好是能静态的,提高客户访问速度.也便于搜索引擎搜索.所以,就希望我们的动态读取数据库的页面,尽可能的生成静态页面.一下系列文章,介绍一下个人的解决方案. ...
- Ubuntu adb 报错:no permissions (missing udev rules? user is in the plugdev group);问题的解决办法
问题重现: 确认: Android设备已连接PC Android设备已打开USB调试 zuo@zuo-ubuntu:/etc/udev/rules.d$ adb devices List of dev ...
- Django_文件下载
一.小文件下载 1.视图 views.py 三种方式实现,任选其一 (1)使用HttpResponse # 导入模块from django.shortcuts import HttpResponse ...
- 记录--Vue使用CDN引入,响应式失效?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 最近心血来潮,想要在本地开发时,也用CDN的方式引入 Vue,想着既然通过CDN引入了,那么在项目中就没必要再 import Vue ...
- 移动端弹性布局方案lib-flexible实践
2个月前,写过一篇文章<从网易与淘宝的font-size思考前端设计稿与工作流>总结过一些移动web中有关手机适配的一些思路,当时也是因为工作的关系分析了下网易跟淘宝的移动页面,最后才有那 ...
- SpringBoot项目 填充Excel模板 导出 下载
模板 下载后的效果 项目结构 pom <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- Oracle 视图创建自增ID
select ROW_NUMBER() over (order by sysdate()) as id
- MarkDown常用语法Typora
一级标题:左右分别 # 二级标题:左右分别 ## 三级标题 四级标题 五级标题 六级标题 加粗:左右分别 ** 斜体:左右分别 * 斜体加粗:左右分别 *** 删除:左右分别 ~~ "> ...