【算法萌新闯力扣】:旋转链表

    力扣题目:旋转链表

开篇

  今天是备战蓝桥杯的第25天和算法村开营第3天!经过这3天的学习,感觉自己对链表的掌握程度大大地提升,尤其是在帮村里的同学讨论相关问题时。本篇文章,给大家带来一道旋转链表的题目,用到了巧妙的快慢指针方法!

题目链接: 61.旋转链表

题目描述


在这里插入图片描述

代码思路

 先用双指针策略找到倒数K的位置,也就是{1,2,3}和{4,5}两个序列,之后再将两个链表拼接成{4,5,1,2,3}就行了。具体思路是:
因为k有可能大于链表长度,所以首先获取一下链表长度,如果然后计算应该反转多少次,0次则直接返回原链表。然后
1.快指针先走与反转次数相同的步。
2.慢指针和快指针一起走。
3.快指针走到链表尾部时,慢指针所在位置刚好是要断开的地方。把快指针指向的节点连到原链表头部,慢指针指向的节点断开和下一节点的联系。
4.返回结束时慢指针指向节点的下一节点。

代码纯享版

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null || k == 0) return head;
        ListNode fast = head, slow = head;
        int sum = 0;
        ListNode test = head;
        while(test != null){
            sum++;
            test = test.next;
        }
        if(k % sum == 0)return  head;
        int len = k % sum;
        while(len > 0){
            fast = fast.next;
            len--;
        }
        while(fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }
        ListNode newhead = slow.next;
        slow.next = null;
        fast.next = head;

        return newhead;
    }
}

代码逐行解析版

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null || k == 0) return head; //排除特殊情况,如果不排除,下面的k%sum中会出现sum==0的报错
        ListNode fast = head, slow = head; //创建快慢指针
        int sum = 0; 
        ListNode test = head; 
        while(test != null){ //利用test来遍历整个链表
            sum++; //sum统计链表的长度
            test = test.next;
        }
        if(k % sum == 0)return  head; //k是sum的整数倍,反转完结果与原链表相同,直接返回原链表
        int len = k % sum; //计算出最终要分开的节点
        while(len > 0){ //先让快指针领先慢指针len个结点
            fast = fast.next; 
            len--;
        }
        while(fast.next != null){ //两个指针同时移动,当快指针到尾结点时,慢指针到达分开的位置
            fast = fast.next;
            slow = slow.next;
        }
        ListNode newhead = slow.next; //三步操作,让慢指针后面的部分拼接到头结点
        slow.next = null;
        fast.next = head;

        return newhead; //此时原本慢指针到下一个结点变成头结点,返回它
    }
}

其他解法

1.第一种是将整个链表反转,如实例1中,把链表变成{5,4,3,2,1},然后再将前K和N-K两个部分分别反转,也就是分别变成了{4,5}和{1,2,3}这样就轻松解决了。

2.力扣官方题解提供了先将链表闭合为环,然后寻找合适的位置断开的解法

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if (k == 0 || head == nullptr || head->next == nullptr) {
            return head;
        }
        int n = 1;
        ListNode* iter = head;
        while (iter->next != nullptr) {
            iter = iter->next;
            n++;
        }
        int add = n - k % n;
        if (add == n) {
            return head;
        }
        iter->next = head;
        while (add--) {
            iter = iter->next;
        }
        ListNode* ret = iter->next;
        iter->next = nullptr;
        return ret;
    }
};

结语

  如果这道题的分享对您有所帮助,点个关注,为会每天更新力扣题的分享,与大伙儿一同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/197735.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:用队列实现栈(后进先出)

题目描述 题目链接:225. 用队列实现栈 - 力扣(LeetCode) 题目分析 我们先把之前写的队列实现代码搬过来 用队列实现栈最主要的是实现栈后进先出的特点,而队列的特点是先进先出,那么我们可以用两个队列来实现 一个队…

PTA-6-48 使用面向对象的思想编写程序描述动物

题目: 使用面向对象的思想编写程序描述动物,说明: (1) 分析兔子和青蛙的共性,定义抽象的动物类,拥有一些动物共有的属性:名字、颜色、类别(哺乳类、非哺乳类)&#xff0c…

Redis 事件轮询

1 Redis 为什么快 数据存在内存中, 直接操作内存中的数据单线程处理业务请求避免了多线的上下文切换, 锁竞争等弊端使用 IO 多路复用支撑更高的网络请求使用事件驱动模型, 通过事件通知模式, 减少不必要的等待… 这些都是 Redis 快的原因。 但是这些到了代码层面是如何实现的呢…

出纳常用的月报表,熬夜做了这8份直接用!

做出纳,公司财务的日报表是必不可少的,收支了多少,支出了多少,这些都是要记录下来的! 一份出纳日报表通常包含以下内容: 1. 日期:报告涵盖的具体日期,标明是哪一天的财务数据。 2. 收…

【论文阅读】An Experimental Survey of Missing Data Imputation Algorithms

论文地址:An Experimental Survey of Missing Data Imputation Algorithms | IEEE Journals & Magazine | IEEE Xplore 处理缺失数据最简单的方法就是是丢弃缺失值的样本,但这会使得数据更加不完整并且导致偏差或影响结果的代表性。因此,…

bash编程 数组和for循环的应用

bash编程 数组和for循环的应用 1、问题背景2、bash 定义数组3、for循环遍历输出数组所有元素4、编写bash脚本输出每个端口是否在监听状态 1、问题背景 linux服务器开机后,需要检查一组端口是否在监听,以便判断这些端口对应的服务是否在运行。可以考虑使…

别再让假的fiddler教程毒害你了,来看这套最全最新的fiddler全工具讲解

fiddler界面工具栏介绍 添加图片注释,不超过 140 字(可选) (1)WinConfig:windows 使用了一种叫做“AppContainer”的隔离技术,使得一些流量无法正常捕获,在 fiddler中点击 WinConfig…

轻巧高效的剃须好工具,DOCO黑刃电动剃须刀上手

剃须刀大家都用过,我比较喜欢电动剃须刀,尤其是多刀头的悬浮剃须刀,感觉用起来很方便,剃须效率也很高。最近我在用一款DOCO小蔻的黑刃电动剃须刀,这款剃须刀轻巧易用,而且性价比超高。 相比于同类产品&…

深度盘点:100 个 Python 数据分析函数总结

经过一段时间的整理,本期将分享我认为比较常用的100个实用函数,这些函数大致可以分为六类,分别是统计汇总函数、数据清洗函数、数据筛选、绘图与元素级运算函数、时间序列函数和其他函数。 技术交流 技术要学会交流、分享,不建议…

两个mongo表,A和B,以A中的_id记录的为准, 删掉B表中A表中没有的记录

可以使用 MongoDB 的聚合管道和 $lookup 操作符来实现这个需求。以下是一个示例的查询语句,假设集合 A 和集合 B 分别对应表 A 和表 B: db.B.aggregate([{$lookup: {from: "A",localField: "_id",foreignField:

单片机复位电路

有时候我们的代码会跑飞,这个时候基本上是一切推到重来.”推倒重来”在计算机术语上称为复位.复位需要硬件的支持,复位电路就是在单片机的复位管脚上产生一个信号,俗称复位信号.这个信号需要持续一定的时间,单片机收到该信号之后就会复位,从头执行。 复位原理: 那么…

【工业智能】Solutions

各类问题对应的解决方案 工艺参数推荐APC 排产调度智能算法强化学习 运筹优化空压机群控 预测 工艺参数推荐 APC 排产调度 智能算法 遗传算法 强化学习 DDQN 运筹优化 空压机群控 MIP混合整数规划 能耗优化 预测 电池容量预测 时序预测,回归预测 点击剩余…

【Vue】Vue3 配置全局 scss 变量

variables.scss $color: #0c8ce9;vite.config.ts // 全局css变量css: {preprocessorOptions: {scss: {additionalData: import "/styles/variables.scss";,},},},.vue 文件使用

创建一个带有背景图层和前景图层的渲染窗口

开发环境: Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题: 创建一个带有背景图层和前景图层的渲染窗口,知识点:1. 画布转image;2. 渲染图层设置;3.…

.NET生成微信小程序推广二维码

前言 对于小程序大家可能都非常熟悉了,随着小程序的不断普及越来越多的公司都开始推广使用起来了。今天接到一个需求就是生成小程序码,并且与运营给的推广图片合并在一起做成一张漂亮美观的推广二维码,扫码这种二维码就可以进入小程序。为了…

Python二叉树用法介绍

更多资料获取 📚 个人网站:ipengtao.com 二叉树是一种常见的数据结构,具有树形结构,每个节点最多有两个子节点。Python中有多种方式来表示和操作二叉树,本文将介绍二叉树的基本概念、构建、遍历和一些常见操作&#x…

Opencv-C++笔记 (19) : 分水岭图像分割

文章目录 一、基于距离变换与分水岭的图像分割1、图像分割2、距离和变换与分水岭距离变换常见算法有两种分水岭变换常见的算法 3、距离变换API函数接口4、watershed 分水岭函数API接口步骤 5、代码 一、基于距离变换与分水岭的图像分割 1、图像分割 图像分割(Image Segmentat…

A start job is running for Hold unt…s up (1d 18h 52min 25s / no limit) 如何去掉

在host串口里一直出现打印 A start job is running for Hold unt…s up (1d 18h 52min 25s / no limit) 这个是有一个进程一直在执行中,那么是什么呢?因为我的host通过SSH连接后就可以进入host shell界面了。那这个线程是什么程序导致的呢? …

最透彻HTTPS

Why HTTPS 我们先来看看HTTP。HTTP(Hypertext Transfer Protocol)超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议,可以说 HTTP 是当代互联网通信的基础。 但是,HTTP 有着一个致命的缺陷&…

位运算总结

文章目录 🍈1. 基础位运算🍌2. 给一个数n,确定它的二进制表示中的第x位是0还是1🍏3. 将一个数n的二进制表示的第x位修改成1🍓4. 将一个数的n的二进制表示的第x位修改成0🥔5. 位图的思想🫒6. 提前…