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

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

往期回顾:

数据结构——单链表 

单链表力扣刷题

文章目录

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

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

双指针图解

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 优化搜索速…

复习之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;要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红…

如何用12306的积分买火车票

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

【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.…

揭秘!头条百科词条创建全过程及技巧解析

随着互联网时代的到来&#xff0c;人们获取信息的方式越来越便捷。作为国内领先的信息平台&#xff0c;头条百科成为了很多人查阅知识的首选。然而&#xff0c;如何在头条上创建百科词条&#xff0c;让更多人了解和熟知自己呢&#xff1f;本文伯乐网络传媒将为您揭开这个谜团&a…

基于C语言 --- 自己写一个三子棋小游戏

C语言程序设计笔记---019 初阶三子棋小游戏(开源)1、arr_main.c程序大纲2、arr_game1.h3、arr_game1.c3.1、 自定义初识化函数 InitBoard( ) 和 自定义显示函数 DisPlayBoard( )3.2、 自定义玩家下棋函数 PlayerMove( )3.4、 自定义电脑下棋函数 ComputerMove( )3.5、 输赢判断…

反射简述

什么是反射反射在java中起到什么样的作用获取class对象的三种方式反射的优缺点图 什么是反射 JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&…

自然语言处理学习笔记(一)————概论

目录 1.自然语言处理概念 2.自然语言与编程语言的比较 &#xff08;1&#xff09;词汇量&#xff1a; &#xff08;2&#xff09;结构化&#xff1a; &#xff08;3&#xff09;歧义性&#xff1a; &#xff08;4&#xff09;容错性&#xff1a; &#xff08;5&#xff0…

LabVIEW FPGA开发实时滑动摩擦系统

LabVIEW FPGA开发实时滑动摩擦系统 由于非线性摩擦效应的建模和补偿的固有困难&#xff0c;摩擦系统的运动控制已被广泛研究。最近&#xff0c;人们更加关注滑动动力学和滑动定位&#xff0c;作为传统机器人定位的低成本和更灵活的驱动替代方案。摩擦控制器设计和适当选择基础…