快慢指针思想(Hare Tortoise 算法)

目录​​​​​​​

一、快慢指针概念

二、常用场景

 2.1 寻找倒数第k个节点

2.2 判断回文链表

2.3 用于判断链表中是否存在 “环”  

2.4 用于判断存在“环”的链表中,“环”的起始位置


一、快慢指针概念

        快慢指针是一种常用的数据结构思想,主要用于解决链表中的问题。

        该算法会使用两个移动速度不同的指针,一个快指针和一个慢指针。


二、常用场景

 2.1 寻找倒数第k个节点

 主要逻辑:

  • 假设寻找倒数第k个节点,
  • 快指针先走k步,
  • 然后快慢指针一起走,
  • 当快指针走到null时,慢指针就指向要找的那个节点。

代码实现: 

    public ListNode FindKthToTail (ListNode pHead, int k) {ListNode fast = pHead;while(k > 0){if(fast == null){ //处理k值大于链表长度的问题;return null;}fast = fast.next;k--;}ListNode slow = pHead;while(fast != null){fast = fast.next;slow = slow.next;}return slow;}

2.2 判断回文链表

 主要逻辑:

  • 使用快指针找到链表的中间节点,
  • 逆序后半部分节点,
  • 快慢指针一起移动,并在移动时对比各自指向的元素是否内容一致。

代码实现:

    public class ListNode {int val;ListNode next = null;public ListNode(int val) {this.val = val;}}public boolean isPail (ListNode head) {if (head == null) {return true;}//设置快慢两个指针;ListNode fast = head;ListNode slow = head;while(fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;} //走完这个循环,slow指向中间节点;fast = head; //重新获得头节点;slow = reverse(slow); //逆序链表后半段;//两个指针同时走,直到slow为空;while(slow != null){//出现值不同,则直接返回false;if(fast.val != slow.val){return false;}fast = fast.next;slow = slow.next;}return true;}private ListNode reverse(ListNode cur) {ListNode prev = null;while(cur != null){ListNode curNext = cur.next;cur.next = prev;prev = cur;cur = curNext;}return prev;}

2.3 用于判断链表中是否存在 “环”  

主要逻辑:

  • 快指针每次移动两个节点,慢指针每次移动一个节点,
  • 当快慢两个指针相遇时,则表示存在环,
  • 当快指针指向null,或快指针的下一节点指向null时,则不存在环。

代码实现: 

    public boolean hasCycle(ListNode head) {if(head == null){return false;}ListNode fast = head;ListNode slow = head;while(fast != null && fast.next != null){slow = slow.next;fast = fast.next.next;if(fast == slow){return true;}}return false;}

2.4 用于判断环形链表中,“环”的起始位置

主要逻辑:

  • 快指针每次移动两个节点,慢指针每次移动一个节点,
  • 当快慢两个指针相遇时,将其中一个指针重置为链表的头节点,
  • 两个指针同时每次移动一个节点,
  • 当两个节点相遇时,相遇的位置就是环的起始位置。

代码实现: 

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

( 哈哈哈~~ 文章结束!) 

( 看到这里,如果有为各位帅哥美女提供一点点灵感,请点一个小小的赞哦,比心💖💖💖 )

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

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

相关文章

Django批量插入数据及分页器

文章目录 一、批量插入数据二、分页1.分页器的思路2.用一个案例试试3.自定义分页器 一、批量插入数据 当我们需要大批量创建数据的时候,如果一条一条的去创建或许需要猴年马月 我们可以先试一试for循环试试 我们首先建立一个模型类来创建一个表 models.py&#xff…

腾讯云代金券怎么领取(腾讯云代金券在哪领取)

腾讯云代金券是可抵扣费用的优惠券,领券之后新购、续费、升级腾讯云相关云产品可以直接抵扣订单金额,节省购买腾讯云的费用,本文将详细介绍腾讯云代金券的领取方法和使用教程。 一、腾讯云代金券领取 1、新用户代金券【点此领取】 2、老用户…

5、基础入门——资产架构端口应用WAF站库分离负载均衡

资产架构 目录型网站安全:一个IP对应一个域名(bbs.xiaodi8.com),该域名(bbs.xiaodi8.com)下有一个网站,该域名的某个目录下(bbs.xiaodi8.com/blog)也有一个网站。 端口型…

【软考】文件的组织结构

目录 一、说明二、逻辑结构2.1 说明2.2 记录式文件2.2.1 说明2.2.2 顺序文件2.2.3 索引文件2.2.4 索引文件 2.3 流式文件 三、物理结构3.1 说明3.2 链接方式之隐式链接3.3 链接方式之显式链接 一、说明 1.组织结构是文件的组织形式。 2.逻辑结构为用户可见的的文件结构。 3.物理…

模拟量采集----测量输入的电压

生活中的模拟量有很多 大多都为电压信号和电流信号 今天讲如何测量输入的电压信号 由图中的黄线可知,该运放是采用的同相放大器中的电压跟随器 电压跟随器的特点是电压的输入和输出隔离 同相运放的输入与输出的关系是:输出1R2/R1 在图上对应的就是输…

大数据安全 测试

测试1、用户 hive/1.common2.hadoop.fql.comLEXIN.COM 和 nn/1.common2.hadoop.fql.com 分别对 Hive 进行查询 &#xff08;1&#xff09;HDFS 配置 vim /usr/local/fqlhadoop/hadoop/conf/core-site.xml <property><name>hadoop.proxyuser.hive.hosts</name&g…

linux基本指令以及热键

基本指令 ♥clear ♥whoami ♥who ♥pwd ♥ls指令&#xff08;重点&#xff09; ls -a&#xff1a; ls -l ♥mkdir ♥cd指令 ♥touch指令 ♥stat指令 ♥rmdir指令 && rm 指令 ♥man指令 ♥nano指令 ♥cp指令 ♥mv指令 ♥cat指令 &#x1f5e1;输出/输出重定向 &#x1…

HBase之BlockCache

目录 BlockCacheLruBlockCacheBucketCacheCompressed BlockCache注意点 BlockCache 用于缓存从hdfs读的数据&#xff0c;有两种不同的实现&#xff0c;LruBlockCache(利用堆内存)和BucketCache(利用非堆内存) LruBlockCache 使用LRU算法 Single access级&#xff1a;首次从…

腾讯云HAI域AI作画

目录 &#x1f433;前言&#xff1a; &#x1f680;了解高性能应用服务 HAI &#x1f47b;即插即用 轻松上手 &#x1f47b;横向对比 青出于蓝 &#x1f424;应用场景-AI作画 &#x1f424;应用场景-AI对话 &#x1f424;应用场景-算法研发 &#x1f680;使用HAI进行…

【链表的说明、方法---顺序表与链表的区别】

文章目录 前言什么是链表链表的结构带头和不带头的区别 链表的实现&#xff08;方法&#xff09;遍历链表头插法尾插法任意位置插入一个节点链表中是否包含某个数字删除链表某个节点删除链表中所有关键字key清空链表所有节点 ArrayList 和 LinkedList的区别总结 前言 什么是链…

代码随想录二刷 | 链表 | 删除链表的倒数第N个节点

代码随想录二刷 &#xff5c; 链表 &#xff5c; 删除链表的倒数第N个节点 题目描述解题思路 & 代码实现双指针法 题目描述 19.删除链表的倒数第N个节点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入…

8、信息打点——系统篇端口扫描CDN服务负载均衡WAF

文章目录 获取网络信息获取服务信息获取阻碍信息 获取网络信息 服务器厂商信息&#xff08;阿里云&#xff1f;腾讯云&#xff1f;&#xff09; 收集的原因&#xff1a;如果服务器架设在云上&#xff0c;不同厂商的一些配置信息不同。判断方法&#xff1a;直接在ip/域名网站搜相…

整套数字化招采平台安全防御体系

招采平台作为数字化供应链的重要组成部分&#xff0c;需要确保招标采购过程的安全性,主体信息和交易数据信息尤为重要,通过必要的安全架构、技术和安全管理制度&#xff0c;做到事前防范、事中监管和事后审计的安全防御。 一、平台技术安全架构 1、先进的技术架构&#xff0c…

MeterSphere | 在接口自动化场景中,设置全局Token方法

目标 在接口自动化场景中&#xff0c;设置全局Token方法 方法 -- BeanShell 语言 // 导包 import org.json.*;// 创建sign值 String response prev.getResponseDataAsString();JSONObject responseJson new JSONObject(response);String token responseJson.get("bo…

java中stream常用api介绍

stream相关api对于集合操作非常方便&#xff0c;可以通过链式编程完成数据的处理&#xff0c;有时候很复杂的数据处理通过使用stream的相关api可以非常方便的完成&#xff0c;使用lambda表达式更可以简化为一行代码&#xff0c;下面就介绍一下stream的相关api方法&#xff0c;感…

Latex学习

二 实例 1. \Delta_{w}\frac{\partial l}{\partial w_{i1}}weight:\frac{\partial l}{\partial x_{i1}} 效果如下 其中对于希腊字母的大小写来说&#xff0c;可以参考&#xff1a; 【LaTeX 语法】字母表示 ( 大写、小写、异体 希腊字母 | 粗体字母 | 花体字母 )_latex字母_韩…

Centos8部署LNMP架构

LNMP架构 LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。L指Linux&#xff0c;N指Nginx&#xff0c;M一般指MySQL&#xff0c;也可以指MariaDB&#xff0c;P一般指PHP&#xff0c;也可以指Perl或Python。 1.Linux是一类Unix计算机操作系统的统称…

09【保姆级】-GO语言的数组和切片

09【保姆级】-GO语言的数组 一、数组1.1 数组定义1.2 数组的使用1.3 数组的遍历1.4 数组的应用案例 二、切片2.1 切片的介绍2.2 切片的原理2.3 切片的三种使用 之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&a…

Spring框架学习 -- 创建与使用

目录 (1) 创建spring 项目 ① 创建maven项目 ②添加spring框架支持 ③ 添加启动项 (2) 创建 Bean对象 (3) 将Bean注入到容器 (4) 获取Bean对象 (5) 注意事项 (6) Spring的创建和使用流程图 创作不易多多支持 (1) 创建spring 项目 首先我们使用的开发工具为idea 专业版…

为什么原生IP可以降低Google play账号关联风险?企业号解决8.3/10.3账号关联问题?

在Google paly应用上架的过程中&#xff0c;相信大多数开发者都遇到过开发者账号因为关联问题&#xff0c;导致应用包被拒审和封号的情况。 而众所周知&#xff0c;开发者账号注册或登录的IP地址及设备是造成账号关联的重要因素之一。酷鸟云最新上线的原生IP能有效降低账号因I…