leetcode网解题心得——61. 旋转链表

1、题目描述

给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。如图:

试题链接:https://leetcode-cn.com/problems/rotate-list/

2、算法分析:

为了完成该算法,在进行代码编写时先进行了数学分析,下面照片是数学分析的草稿,图可能有些丑。

​

下面解释下该图:

  1. 由于题目是循环列表,可以将单链表进行打断,组成一个圆圈。而指针所指的方向即是起点。
  2. 模拟循环,由循环后的结果可以得出,如果循环次数恰好为一圈时等于没循环。
  3. 同时,可以很简单的看出,k=几,就相当于顺时针转动k步
  4. 由于单链表只是一侧的,在图上更方便逆时针转动,因此可计算出逆时针转动的步数=角-k

3、用自然语言描述该算法

  1. 先求得链表的长度,即为多边形角度
  2. 遍历单链表,到最后一个位置,然后将指向修改为指向头结点,打造成环形链表
  3. 由分析计算出来的公式,逆时针将辅助指针旋转角度-k-1步,位于所要的结果前一个
  4. 保存下一个结点,因为打断后无法过去,需要先保存
  5. 打断循环链表,返回保存的结点

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. 旋转链表的更多相关文章

  1. Java实现 LeetCode 61 旋转链表

    61. 旋转链表 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = ...

  2. 【LeetCode】61. 旋转链表

    61. 旋转链表 知识点:链表: 题目描述 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置. 示例 输入:head = [1,2,3,4,5], k = 2 输出:[4 ...

  3. LeetCode 61. 旋转链表(Rotate List)

    题目描述 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出 ...

  4. 61. 旋转链表-leetcode

    给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4-& ...

  5. leetcode 61. 旋转链表

    题目描述: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输 ...

  6. LeetCode 61——旋转链表(JAVA)

    给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4-& ...

  7. leetcode刷题-61旋转链表

    题目 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2输出: 4 ...

  8. LeetCode 61——旋转链表

    1. 题目 2. 解答 2.1. 方法一 将链表每个节点向右移动 1 个位置,其实就是让链表最后一个结点指向第一个结点. 因此,向右移动 k 个位置就重复上述过程 k 次即可. 然后,我们注意到,若链 ...

  9. LeetCode:旋转链表【61】

    LeetCode:旋转链表[61] 题目描述 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5- ...

随机推荐

  1. Java 字符串、数值与16进制相互转化

    字符串.数值与16进制相互转化 首先创建一个工具类: package c; public class DataUtils { /* * 字节数组转16进制字符串 */ public static St ...

  2. Java通过反射读取泛型

    1.在这里有必要先提一句关于javabean,建议有一个构造器,而不是必须要写的,这是一个良好的习惯. 这样做肯定是有好处的,如果你的一个类写了带参的构造方法,而没有写空的构造方法,那么,如有有一个类 ...

  3. 一段讯飞、百度等语音识别API无法识别的语音最终解决办法

    最近在做语音识别.字幕扒词相关的工作,遇到了一段录音(https://download.csdn.net/download/u014220286/12169183,各位有兴趣的可以下载下来试试),音质 ...

  4. 265. 粉刷房子 II

    Q: A: 首先这题可以和粉刷房子这题一样解法,对于i号房子,遍历k种颜色,对于每一种,都去找i-1号房子除该颜色之外的最小花费.但上一题是3种颜色,总复杂度O(N),这题k种颜色,复杂度O(NK^2 ...

  5. 解决VS2017中出现:This function or variable may be unsafe

    解决办法:项目名称-右键属性-C/C++ - 预处理器 -预处理器定义 - 右侧下拉框中选择"编辑"- 在第一个编辑框中添加_CRT_SECURE_NO_WARNINGS

  6. win10 superfetch 使系统变慢

    win10 superfetch是干什么的? 时间:2018-12-28 来源:莫回首系统 作者:win7 很多用户喜欢关注CPU的运行状态,来保障系统的运行速度不受影响,今早,有ghost win1 ...

  7. 3.0 java学习网站

    1.http://www.rupeng.com/Courses/Index/51 2.https://www.zhihu.com/question/25255189

  8. Educational Codeforces Round 80 (Rated for Div. 2)D(二分答案,状压检验)

    这题1<<M为255,可以logN二分答案后,N*M扫一遍表把N行数据转化为一个小于等于255的数字,再255^2检验答案(比扫一遍表复杂度低),复杂度约为N*M*logN #define ...

  9. python基础之函数,递归,内置函数

    一.数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因 ...

  10. 爬虫 - Scrapy中间件

    前提:看Scrapy架构图 不管什么Middlewares,都写在middlewares.py里面. 然后在settings.py里的DOWNLOADER_MIDDLEWARES或者SPIDER_MI ...