链表刷题常用技巧——快慢指针

强大,不动如山的强大,不会输给自己的真正的强大。 

往期回顾:

数据结构——单链表 

单链表力扣刷题

文章目录

经典例题:链表的中间结点

题目分析及双指针思路引入 

双指针图解

leetcode 核心代码

判断环形链表——快慢指针延伸为追及问题

题目分析,图解

leetcode 核心代码


  大家好,我是纪宁。

  数据结构链表部分的面试、笔试大多都是在单链表部分,且大多题都是没有哨兵位的头结点,题目相数组通常比较难。这篇文章就给大家介绍一个单链表这里做题的常用技巧——快慢指针。

  所谓快慢指针,就是有两个指针来维护单链表,通常定义为 slow 和 fast ,这两个指针遍历链表的速度不同。

经典例题:链表的中间结点

  给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

题目分析及双指针思路引入 

  在这个题中,如果要找的是数组中间元素的话,可能比较简单,直接计算出数组大小,再规定只遍历一半的内容即可。但是在链表,你除了知道当前结点的内容和下一节点的地址,一无所知,所以不能控制指针走的位置。

  有一个特别巧妙的方法,就是定义两个指针,一个指针 slow 每次向后走一步, slow =slow->next;一个指针每次向后走两步,fast = fast -> next ->next ,这样,当指针 fast 或者 fast-> next 成为 NULL 指针的时候,slow 指针恰好走到了链表中间的位置,这样,就找到了链表的中间结点。

双指针图解

当链表长度为奇数时

当链表长度为偶数时 

 

leetcode 核心代码

struct ListNode* middleNode(struct ListNode* head){struct ListNode*slow,*fast;slow=head;fast=head;while(fast!=NULL&&fast->next!=NULL){fast=fast->next->next;slow=slow->next;}return slow;
}

  代码中要注意的一点是,因为fast 指针一次走‘两步’,所以循环的终止条件是 fast 或者 fast-> next 为空,最后返回 slow 指针。

判断环形链表——快慢指针延伸为追及问题

题目:给你一个链表的头节点 head ,判断链表中是否有环。

  如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

题目分析,图解

  如图:上面这个链表就是在 d3 进入环,d6的指针域指向d3,然后链表就会在 d3——d4——d5——d6——d3 这个环中循环。

  首先,这道题没有给出进入环的位置,所以进环有很多种可能,这就排除了遍历链表的想法。这道题也可以使用快慢指针的方法,fast 指针和 slow 指针同时开始从头指针往后走,fast指针每次走两步,slow指针每次走1步,看这两个指针能否相遇。

  如果链表带环,则快指针和慢指针一定会相遇,否则就不会相遇。这个追击原理类似于和你女朋友一起去操场跑圈,你们同时出发,只要你跑的比她快,并且你们在相遇前都不停,就一定能实现套圈。 

  所以,只要在指针 fast 和 指针 slow 往后走的时候,发现他们的指向相同(fast==slow)的时候,就说明链表带环(套圈了)。如果fast 或 fast->next 为空,说明链表遍历已经结束,链表不带环。 

leetcode 核心代码

bool hasCycle(struct ListNode *head) {struct ListNode *slow=head;struct ListNode *fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(fast==slow)return true;}return false;
}

  这就是博主给大家带来的单链表部分刷题的常用技巧——快慢指针,感谢观看。

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

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

相关文章

Ubuntu Server版 之 apache系列 安装、重启、开启,版本查看

安装之前首先要检测是否安装过 apt list --installed | grep tool tool:要检测的名称,如mysql、apache 、ngnix 等 安装 apache sudo apt install apache2 安装apache 默认是开启的 可以通过浏览器 检测一下 service apache stop # apache 停止服务…

PSP - 蛋白质序列搜索算法 MMseqs2 与 HHblits 的搜索结果差异

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132025401 在 AlphaFold2 中,使用 HHblits 算法搜索 BFD 与 UniRef30,输出 bfd_uniref_hits.a3m 文件。MMseqs2 优化搜索速…

网络应用技术师技能考试试题(上)

♥️作者:小刘在C站 ♥️个人主页:

复习之linux高级存储管理

一、lvm----逻辑卷管理 1.lvm定义 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制。 逻辑卷管理器(LogicalVolumeManager)本质上是一个虚拟设备驱动,是在内核中块设备和物理设备…

【C++】STL中list的模拟实现(增删查改,迭代器封装,运算符重载)

文章目录 前言大体框架: 一、节点的封装(list_node)二、迭代器的封装(_list_iterator)1.类模板的定义:2.构造函数3.前置,后置4.前置--,后置--5.解引用(operator*())6. ->重载(operator- >…

【腾讯云 Cloud Studio 实战训练营】永不宕机的IDE,Coding Everywhere

【腾讯云 Cloud Studio 实战训练营】永不宕机的IDE,随时随地写代码! 写在最前视频讲解:Cloud Studio活动简介何为腾讯云 Cloud Studio?Cloud Studio简介免费试用,上手无忧Cloud Studio 特点及优势云端开发多种预制环境可选metawo…

ansible自动化运维(二)剧本、角色编写实战

😘作者简介:一名运维工作人员。 👊宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。 🙏创作不易,动动小…

计数排序算法

计数排序 计数排序说明: 计数排序(Counting Sort)是一种非比较性的排序算法,它通过统计元素出现的次数,然后根据元素出现的次数将元素排列在正确的位置上,从而实现排序。计数排序适用于非负整数或者具有确…

动态sql以及常用的标签

什么是动态sql: 指根据不同的条件生成不同的sql 搭建环境: 建表: create table blog( id varchar(50) not null comment 博客id, title varchar(100) not null comment 博客标题, author varchar(30) not null comment 博客作者, create_ti…

yolo系列笔记(v4-v5)

YOLOv4 YOLOv4网络详解_哔哩哔哩_bilibili 网络结构,在Yolov3的Darknet的基础上增加了CSP结构。 CSP的优点: 加强CNN的学习能力 去除计算瓶颈。 减少显存的消耗。 结构为: 、 其实还是类似与残差网络的结构,保留下采样之前…

分析npm run serve之后发生了什么?

首先需要明白的是,当你在终端去运行 npm run ****,会是什么过程。 根据上图的一个流程,就可以衍生出很多问题。 1,为什么不直接运行vue-cli-service serve? 因为直接运行 vue-cli-service serve,会报错&#xff0c…

【已解决】如果将MySQL数据库中的表生成PDM

数据库表PDM关系图 | 原创作者/编辑:凯哥Java | 分类:经验分享 有时候,我们需要MySQL数据库中的表生成对应的PDM文件,这里凯哥就讲讲第一种将MySQL数据库的表生成对应的PDM文件。 环境准备: MySQL数据库连接客户端&…

<el-date-picker>组件选择开始时间,结束时间自动延长30min

背景&#xff1a;选择开始时间&#xff0c;结束时间自动增加30分钟&#xff0c;结束时间也可重新选择&#xff0c;如图&#xff1a; <el-form-item label"预约开始时间" prop"value1"><el-date-pickersize"large"v-model"ruleForm…

[数据库]对数据库事务进行总结

文章目录 1、什么是事务2、事务的特性&#xff08;ACID&#xff09;3、并发事务带来的问题4、四个隔离级别&#xff1a; 1、什么是事务 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红…

九耶|阁瑞钛伦特:以下是一个地铁跑酷html代码

以下是一个简单的地铁跑酷的 HTML 代码示例&#xff1a; <!DOCTYPE html> <html> <head><title>地铁跑酷</title><style>#gameContainer {width: 400px;height: 600px;background-color: #000;position: relative;margin: 0 auto;overflo…

mount: wrong fs type, bad option, bad superblock报错 ubuntu

问题描述 mount: wrong fs type, bad option, bad superblock Ubuntu无法挂载磁盘。 原因 很大概率是你的硬盘是NTFS。 解决 sudo apt install ntfs-3g即可。

如何用12306的积分买火车票

积分买的票是不允许退票的&#xff0c;所以最好自己买票的时候用。 积分获取 是根据价格*5&#xff0c;比如我买的是100元的票就可以获得500积分。

AJAX并发请求控制

AJAX、axios、fetch的区别 AJAX Gmail开发人员发现IE里面有个XMLHTTPRequest对象来请求数据时&#xff0c;可以实现无刷新数据请求&#xff0c;所以使用这个特性&#xff0c;进行网络数据请求&#xff0c;这就是AJAX的由来。 AJAX不是一个单词&#xff0c;他的全称是Asynchro…

Java设计模式-享元模式

享元模式 1.享元模式含义 享元模式&#xff0c;运用共享技术有效地支持大量细粒度的对象。 其实享元模式很好理解&#xff0c;就是共享元数据的意思。比如一个小狗类对象&#xff0c;里面的属性有头&#xff0c;耳朵&#xff0c;眼睛&#xff0c;毛色这几个属性&#xff0c;…

【Git系列】Git到远程仓库

&#x1f433;Git到远程仓库 &#x1f9ca;1. github账号注册&#x1f9ca;2. 初始化本地仓库&#x1f9ca;3. 创建GitHub远程仓库&#x1f9ca;4. 给本地仓库起别名&#x1fa9f;4.1 查看远程库的连接地址&#x1fa9f;4.2 起别名 &#x1f9ca;5. git推送操作&#x1f9ca;6.…