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

2024-03-30 15:12

本文主要是介绍天下三分明月夜,独有快慢指针法(链表面试题篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

前言

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

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

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

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

目录

  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.chinasem.cn/article/861827

相关文章

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

【电子通识】半导体工艺——保护晶圆表面的氧化工艺

在文章【电子通识】半导体工艺——晶圆制造中我们讲到晶圆的一些基础术语和晶圆制造主要步骤:制造锭(Ingot)、锭切割(Wafer Slicing)、晶圆表面抛光(Lapping&Polishing)。         那么其实当晶圆暴露在大气中或化学物质中的氧气时就会形成氧化膜。这与铁(Fe)暴露在大气时会氧化生锈是一样的道理。 氧化膜的作用         在半导体晶圆

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

C和指针:结构体(struct)和联合(union)

结构体和联合 结构体 结构体包含一些数据成员,每个成员可能具有不同的类型。 数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。 结构声明 在声明结构时,必须列出它包含的所有成员。 struct tag {member-list} variable-list ; 定义一个结构体变量x(包含

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis