leetcode网解题心得——61. 旋转链表
leetcode网解题心得——61. 旋转链表
1、题目描述
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。如图:

试题链接:https://leetcode-cn.com/problems/rotate-list/
2、算法分析:
为了完成该算法,在进行代码编写时先进行了数学分析,下面照片是数学分析的草稿,图可能有些丑。

下面解释下该图:
- 由于题目是循环列表,可以将单链表进行打断,组成一个圆圈。而指针所指的方向即是起点。
- 模拟循环,由循环后的结果可以得出,如果循环次数恰好为一圈时等于没循环。
- 同时,可以很简单的看出,k=几,就相当于顺时针转动k步
- 由于单链表只是一侧的,在图上更方便逆时针转动,因此可计算出逆时针转动的步数=角-k
3、用自然语言描述该算法
- 先求得链表的长度,即为多边形角度
- 遍历单链表,到最后一个位置,然后将指向修改为指向头结点,打造成环形链表
- 由分析计算出来的公式,逆时针将辅助指针旋转角度-k-1步,位于所要的结果前一个
- 保存下一个结点,因为打断后无法过去,需要先保存
- 打断循环链表,返回保存的结点
4、java语言实现
public static ListNode rotateRight(ListNode head, int k) {
if(head == null) return null;
//1,需要知道链表的长度
ListNode pCurrent = head;
int count = 1;
while(pCurrent.next != null) {
//计数
count++;
//向下
pCurrent = pCurrent.next;
}
//循环结束后,指向的是最后一个结点,对接成循环链表
// System.out.println(count);
pCurrent.next = head;
//指向头,循环链表
pCurrent = pCurrent.next;
//计算有效循环
int total = k % count;
//计算顺转次数
total = count - total;
// System.out.println(total);
for(int i = 1;i < total;i++) {
pCurrent = pCurrent.next;
}
//保存下一个结点
ListNode saveNode = pCurrent.next;
pCurrent.next = null;
return saveNode;
}
算法效果:

算法分析,时间上还行,但是空间上消耗较大。
5、C语言实现
struct ListNode* rotateRight(struct ListNode* head, int k){
if(head == NULL) return NULL;
//1,需要知道链表的长度
struct ListNode* pCurrent = head;
int count = 1;
while(pCurrent->next != NULL) {
//计数
count++;
//向下
pCurrent = pCurrent->next;
}
//循环结束后,指向的是最后一个结点,对接成循环链表
// System.out.println(count);
pCurrent->next = head;
//指向头,循环链表
pCurrent = pCurrent->next;
//计算有效循环
int total = k % count;
//计算顺转次数
total = count - total;
// System.out.println(total);
for(int i = 1;i < total;i++) {
pCurrent = pCurrent->next;
}
//保存下一个结点
struct ListNode* saveNode = pCurrent->next;
pCurrent->next = NULL;
return saveNode;
}
算法效果:

算法分析:根据C语言的提交结果可知,在时间和内存消耗上都较为一般
leetcode网解题心得——61. 旋转链表的更多相关文章
- Java实现 LeetCode 61 旋转链表
61. 旋转链表 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = ...
- 【LeetCode】61. 旋转链表
61. 旋转链表 知识点:链表: 题目描述 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置. 示例 输入:head = [1,2,3,4,5], k = 2 输出:[4 ...
- LeetCode 61. 旋转链表(Rotate List)
题目描述 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出 ...
- 61. 旋转链表-leetcode
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4-& ...
- 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旋转链表
题目 给定一个链表,旋转链表,将链表每个节点向右移动 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- ...
随机推荐
- 【Python】 数字求和
# 用户输入数字 num1 = input('输入第一个数字:') num2 = input('输入第二个数字:') # 求和 sum = float(num1) + float(num2) # 显示 ...
- CSS和JS两种颜色渐变文字效果代码
js实现颜色渐变文字效果代码: <!-- js颜色渐变色文字 --> <div id="moml"> <div style="text-al ...
- php curl请求 header头携带参数
$headers = array( 'api-key:'.$key, 'authorization:'.$authorization, ); //初始化 $curl = c ...
- Mysql 慢查询之showprofile
show profiles:返回服务器上最近执行的语句 资源的使用情况. 一.使用准备 Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后. mysql& ...
- codeforces div2 603 E. Editor(线段树)
题目链接:https://codeforces.com/contest/1263/problem/E 题意:一个编译器,每次输入一些字符,R表示光标右移,L表示光标左移,然后有一些左括号( 和 右括 ...
- 推荐几个c/c++语言编写的游戏源码下载网站
在游戏开发的学习或工作中,利用完好的游戏源码可以事半功倍,不仅可以逆向学习开拓思维,也可以大大减少设计周期.自己浏览了很游戏源码下载的网站,发现大多数质量都良莠不齐,且大部分需要消费才能下载,下面整理 ...
- 每天进步一点点------altium designer Summer09出现的问题解决方案
在编译原理图时,引脚和连线旁边出现很多红线,提示 error:signal with no driver. 原理图没有加入到Project里. 第一次导入没问题,但是改了个元件的封装,在更新一下(De ...
- XFire客户端调用CXF服务端(四)
前面章节:http://www.cnblogs.com/xiehongwei/p/8082337.html 已经开发出了CXF服务端,现在用XFire开发客户端调用CXF服务端,代码如下: impor ...
- 本地mongodb数据库导出到远程数据库中
把本地Mongodb中的数据导入(批量插入)到服务器的数据库中 1.导出数据: mongoexport -d admin -c users -o outdatafile.dat 选项解释: -d 指明 ...
- BZOJ-1563-郁闷的出纳员(权值线段树)
偏移量要考虑清楚. #include <bits/stdc++.h> using namespace std; const int N=4e5+10; const int BASE=1e5 ...