天下三分明月夜,独有快慢指针法(链表面试题篇)

news2024/11/29 4:47:40

本篇会加入个人的所谓‘鱼式疯言’

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!请添加图片描述

前言

本篇文章是小编 刷题篇 的开篇鼻祖, 想要学好编程,小伙们的刷题是必不可少的,这次小编更重磅出击,以 “鱼式疯言”动图 的形式带着小伙们更好的理解我们解题方法是过程

主要内容是讲解我们 快慢指针 这个解题方法对于某些链表题型的堪称秒杀的存在 💥 💥 💥

下面就让充满知识双眼的宝子们一起来瞧瞧呗 💖 💖 💖

特此声明在本系列文章中将以面试题为载体展开解题方法的实际运用的(题目来源于力扣或牛客刷题网站)

目录

  1. 寻找链表的中间结点

  2. 判断链表是否带环

  3. 返回链表倒数第k个节点

一. 寻找链表的中间结点

寻找链表的中间结点题目链接

1. 题目描述

在这里插入图片描述

2. 解题思路

看到此题,小伙伴的第一想法肯定是 遍历链表长度,然后进行在走一半的长度即可到达我们的中间节点

但小编的这里有个独特的解法就是我们的双指针法

如果 节点数是奇数时

请添加图片描述

如果 节点数是偶数时

请添加图片描述

这个就是我们的快慢指针法,简单说明下就是,

先让 fast指针先走两步,然后slow指针走一步

快指针走到下一个节点或者是自身是null时,slow指针的位置就是我们的中间节点

3. 题解代码(Java)

class Solution {
    public ListNode middleNode(ListNode head) {
            
            if(head==null) {
                return head;
            }
            
            ListNode cur=head,prev=head;
            
            while(cur != null && cur.next != null) {
                prev=prev.next;
                cur=cur.next.next;
            }

            return prev;

    }
}

在这里插入图片描述

为啥我们的一个走两步,一个走一步就能找到中间的节点呢 ? ? ?

这其实是一个 数学问题

在这里插入图片描述

鱼式疯言

细节注意

cur != null && cur.next != null

这两个条件可以交换 顺序不 ,答案是 不可以的

如果交换了

cur=null 时就会造成 cur.next 空异常

而我们的正常顺序时

cur != null 时会造成短路就不引起后面的 空指针异常

二. 判断链表是否带环

判断链表是否带环题链接

1. 题目描述

在这里插入图片描述

2. 解题思路

小伙伴们可以思考一个问题,我们当我们的 节点往后走 ,那怎么找到他们 重合的位置呢

请添加图片描述

是的,这里我们还是用到了快慢指针的方法

当 fast 指针走二步, slow 指针走一步时,利用他们俩相差一步的距离就可找到重复的节点,从而重合

3.题解代码

public class Solution {
    
    public boolean hasCycle(ListNode head) {
        if(head==null) {
            return false;
        }
        ListNode slow=head;
        ListNode fast=head;

        while(fast != null && fast.next != null) {
            fast=fast.next.next;
            slow=slow.next;
            if(fast== slow) {
                return true;
            }
        }

        return false;

    }
}

在这里插入图片描述

详细说明下

快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从 链表起始位置 开始运行

如果链表带环则一定会在 环中相遇,否则快指针率先走到 链表的末尾

鱼式疯言

如果我们这样考虑是否可以呢

如果 fast 走三步,slow走一步 会发生什么呢

请添加图片描述

很明显两者是不能相遇的

所以小编的建议是 用 fast 走两步 ,slow走一步 来 解题更妥当 ❣️ ❣️ ❣️

三. 返回链表倒数第k个节点

返回链表倒数第k个节点题目链接

1. 题目描述

在这里插入图片描述

2. 解题思路

还是运用快慢指针的思路:

先让fast 走 k-1 步 ,然后再 在 fast 和 slow 指针一起走 ,直到快指针的 next 为 null

请添加图片描述

3. 题解代码

class Solution {
    public int kthToLast(ListNode head, int k) {
            
            ListNode slow=head,fast=head;
            int i=0;
            while(fast != null) {
                if(i<k) {
                    fast=fast.next;
                    i++;
                } else {
                    fast=fast.next;
                    slow=slow.next;
                }
            }
            if(i<k || k<0) {
                return -1;
            }
            
            return slow.val;
    }
   }

在这里插入图片描述
小伙伴们有思考过这背后的原理是什么么?

是的,让快指针走 k-1 是形成路程差,再一起走的时候,他们的位移差不就是倒数第k个了嘛 💥 💥 💥

总结

在本篇文章中

  1. 寻找链表的中间结点: 用快慢指针的速度差解决中点问题的理解

  2. 判断链表是否带环: 因为环,快慢直接总会一点一点相遇的快慢指针的熟悉

  3. 返回链表倒数第k个节点: 更扩展了,快慢指针也不一定先一起走,也有可能快指针先走,慢指针再跟着的思想

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是CVE? CVE漏洞应该如何防护?

CVE&#xff08;Common Vulnerabilities and Exposures&#xff09;的全称是公共漏洞和暴露&#xff0c;是公开披露的网络安全漏洞列表。IT人员、安全研究人员查阅CVE获取漏洞的详细信息&#xff0c;进而根据漏洞评分确定漏洞解决的优先级。 在CVE中&#xff0c;每个漏洞按CVE-…

Type-C一分二快充线智能分配方案

随着移动设备的普及和快充技术的迅猛发展&#xff0c;Type-C接口已成为众多手机、平板和笔记本电脑的标配。然而&#xff0c;在日常使用中&#xff0c;我们经常会遇到需要同时为多个设备充电的情况。这时&#xff0c;Type-C一分二快充线就显得尤为重要。为了更好地满足用户的充…

CSS之动画

一&#xff0c;动画的制作 实现盒子绕圈走 二&#xff0c; 动画的常用属性 三&#xff0c;动画简写属性 前面两个属性一定要写&#xff0c;第三个linear是指匀速的意思&#xff08;默认是ease&#xff09;

Day26 手撕各种集合底层源码(一)

Day26 手撕各种集合底层源码&#xff08;一&#xff09; 一、手撕ArrayList底层源码 1、概念&#xff1a; ArrayList的底层实现是基于数组的动态扩容结构。 2、思路&#xff1a; 1.研究继承关系 2.研究属性 3.理解创建集合的过程 – 构造方法的底层原理 4.研究添加元素的过程…

【Linux】图文详解Xshell远程连接服务器:以Amazon EC2 VPS为例

文章目录 问题描述解决方案Q&A 问题描述 本地cmd或powershell使用ssh -i “your.pem” user_nameip_address是可以登录Amazon EC2云服务器的。 然而&#xff0c;当使用XShell以SSH加载PEM文件方式登录亚马逊EC2云服务器&#xff0c;一直出现输入密码的问题&#xff0c;如…

FPGA亚稳态学习总结

首先是组合逻辑电路考虑的是竞争冒险&#xff0c;冒险会产生毛刺。重点研究如何去毛刺 时序逻辑电路考虑的是时序不满足会产生的亚稳态问题&#xff1a;如何考量时序满不满足呢&#xff1f;根据不同的场景又有不同的说法。 时序分析的两组基本概念 建立时间与保持时间 1.在…

使用Node.js常用命令提高开发效率

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;广泛用于构建服务器端应用程序和命令行工具。Node.js提供了丰富的命令和工具&#xff0c;可以帮助开发者更高效地开发应用程序。在日常开发中&#xff0c;除了Node.js本身的核心功能外&#xff0c;npm&#x…

加密/ 解密 PDF:使用Python为PDF文档设置、移除密码

在数字化时代&#xff0c;文档的安全性变得越来越重要。特别是对于包含敏感信息的PDF文件&#xff0c;确保其不被未经授权的人员访问或修改是至关重要的。本文将介绍如何使用Python在PDF文档中设置密码&#xff0c;以及如何移除已经设置的密码。 目录 PDF加密基础知识 Pytho…

QT 最近使用的项目配置文件

目录 1 QT 最近使用的项目配置文件所在路径 2 QtCreator.ini 1 QT 最近使用的项目配置文件所在路径 C:\Users\your username\AppData\Roaming\QtProject QtCreator.ini最好先备份一份 2 QtCreator.ini ProjectExplorer 下面的 RecentProjects\FileNames RecentProjects\…

【公示】2023年度青岛市级科技企业孵化器拟认定名单

根据《青岛市科技企业孵化器管理办法》&#xff08;青科规〔2023〕1号&#xff09;&#xff08;以下简称《管理办法》&#xff09;、《关于开展2023年度市级科技企业孵化器认定申报工作的通知》&#xff0c;经申报受理、区市推荐、形式审查、专家评审及现场核查等程序&#xff…

十七、InnoDB 一次更新事务的执行过程

一、InnoDB的一次更新事务是怎么实现的&#xff1f; InnoDB的一次更新事务涉及到多个组件和步骤&#xff0c;包括Buffer Pool、BinLog、UndoLog、RedoLog以及物理磁盘。 下面是一次完整的事务更新操作过程&#xff1a; 1. 加载数据到缓存中&#xff08;Buffer Pool&#xff0…

HTML5通过api实现拖放效果 dataTransfer对象

dataTransfer对象 说明&#xff1a;dataTransfer对象用于从被拖动元素向放置目标传递字符串数据。因为这个对象是 event 的属性&#xff0c;所以在拖放事件的事件处理程序外部无法访问 dataTransfer。在事件处理程序内部&#xff0c;可以使用这个对象的属性和方法实现拖放功能…

【实现报告】学生信息管理系统(链表实现)

目录 实验一 线性表的基本操作 一、实验目的 二、实验内容 三、实验提示 四、实验要求 五、实验代码如下&#xff1a; &#xff08;一&#xff09;链表的构建及初始化 学生信息结构体定义 定义元素类型 链表节点结构体定义 初始化链表 &#xff08;二&#xff09;…

【AI】命令行调用大模型

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【AI】命令行调用大模型引入正文初始化项目撰写脚本全局安装 成果展示 【AI】命令…

Linux——共享内存

Linux——共享内存 什么是共享内存共享内存原理Linux下共享内存的接口创建/获取共享内存&#xff1a;shmgetftok函数 映射共享内存到进程地址空间&#xff1a;shmat 解除共享内存映射&#xff1a;shmdt删除共享内存段&#xff1a;shmctl 利用共享内存进行通信 我们之前学习了匿…

香港服务器怎么看是CN2 GT线路还是CN2 GIA线路?

不知道有没有小伙伴们注意过&#xff0c;很多人在租用香港服务器的时候都习惯性选择 CN2 线路&#xff1f;仿佛香港服务器是否采用 CN2 线路成为个人企业选择香港服务器的一个标准。其实&#xff0c;香港服务器有CN2、优化直连(163)、BGP多线(包含了国际和国内线路)&#xff0c…

Unity 刮刮乐(优化极简)

废话不多说上代码&#xff0c;上图片&#xff0c;欢迎对Unity有兴趣的伙伴和我一起探讨学习 using UnityEngine; using UnityEngine.UI;public class ScratchCardWithSpriteRenderer : MonoBehaviour {// 公开背景和遮罩的Sprite Renderer组件public SpriteRenderer background…

java复原IP 地址(力扣Leetcode93)

复原IP 地址 力扣原题链接 问题描述 有效 IP 地址正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是有效 IP 地址&#xff0c…

爬取b站音频和视频数据,未合成一个视频

一、首先找到含有音频和视频的url地址 打开一个视频&#xff0c;刷新后&#xff0c;找到这个包&#xff0c;里面有我们所需要的数据 访问这个数据包后&#xff0c;获取字符串数据&#xff0c;用正则提取&#xff0c;再转为json字符串方便提取。 二、获得标题和音频数据后&…

基于LSB(最低有效位)的图像水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…