前言

森林里一年一度的赛跑大赛又开始了,乌龟和兔子又被分到了一组,这次乌龟还能跑过兔子吗?

比赛规则:

  1. 乌龟每次移动1个单元格,兔子每次移动2个单元格。
  2. 随机出现一条赛道,赛道可能为直线,也可能为含有环线。
  3. 如果乌龟和兔子跑进环形区域,则一直在环形区域内前进,直到相遇。
  4. 乌龟和兔子都很正经,只往前走,不会后退,也不会相互放水。

根据以上规则,写出程序,判断乌龟是否可以追上兔子(能否相遇)。

思路解析

从比赛规则中可以看出,如果赛道是直线的话,乌龟和兔子是不能相遇的(起点除外)。

所以,乌龟和兔子能否和兔子相遇的关键点在于赛道是否含有环状区域。

这里我们用到“快慢指针”的概念。

快慢指针

快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。

直线赛道

如果是直线赛道,因为兔子比乌龟走的快,只需要判断兔子是否能跑完整个赛道就可以了。

例如,直线赛道由以下节点组成,定义两个指针,兔子为快指针,乌龟为慢指针,如果快指针的下一个节点为Null,说明是直线型赛道,这种情况乌龟是追不上兔子的。

环形赛道

如果是环形赛道,例如下图,其中10的下一个节点为5,在这里形成了一个环,一旦进入这个环中是没办法出去的,所以,如果乌龟和兔子在这种赛道上比赛的话,是会出现相遇的情况的。

因为兔子跑的快(快指针),兔子会先进入环中,乌龟跑的慢后进入环中。此时,乌龟和兔子则一直在环中前进,

代码实现

经过上面的分析,现在来看一下代码的实现。

定义节点

首先定义一个节点类Node,该类有两个属性,一个属性是value用来存放节点的值,另一个属性为next用来存放下一个节点的内存地址。

方便起见,把属性都定义为了public类型。

public class Node {// 链表节点的值public int value;// 链表节点的下一个指针public Node next;public Node(int value) {this.value = value;}
}
复制代码

判断是否有环

判断是否存在环的方法。如果链表为空或小于两位就直接返回false了,长度大于两位才判断是否有环。

public static boolean hasCycle (Node node) {if (node == null || node.next == null || node.next.next == null) {return false;}// 快指针Node quick = node;// 慢指针Node slow = node;// 快指针走的快, 所以判断有没有下一个节点while (quick != null && quick.next != null) {quick = quick.next.next;slow = slow.next;// 如果快慢指针为同一个, 说明存在环形区域if (slow == quick) {return true;}}return false;
}
复制代码

生成直链表

使用for循环生成9个节点,定义一个temp变量荣节点链接起来。

public static void main(String[] args) {Node node0 = new Node(0);Node temp = node0;for (int i = 1; i < 10; i++) {Node node = new Node(i);temp.next = node;temp = node;}boolean cycle = hasCycle(node0);System.out.println(cycle ? "乌龟和兔子能相遇" : "乌龟和兔子不能相遇");
}
复制代码

Debug看下代码node0的值,可以看出最后一个节点的nextnull

因为是直链表,所以运行输出结果为“乌龟和兔子不能相遇”。

生成环形链表

先生成一个直链表,再结束时,让最后一个节点指向节点5,所以定义了一个临时变量来存储节点5的地址,这样就形成了一个环。

public static void main(String[] args) {Node node0 = new Node(0);Node temp = node0;Node node5 = null;for (int i = 1; i < 10; i++) {Node node = new Node(i);temp.next = node;temp = node;if (i == 5) {node5 = node;}}temp.next = node5;boolean cycle = hasCycle(node0);System.out.println(cycle ? "乌龟和兔子能相遇" : "乌龟和兔子不能相遇");
}
复制代码

Debug看下代码node0的值,可以看出节点9的next为节点5,形成了一个环。

因为是环形链表,所以运行输出结果为“乌龟和兔子能相遇”。

总结

本文借助“龟兔赛跑”介绍了了快慢指针以及使用快慢指针来判断一个链表中是否含有环,如有错误,欢迎指出。

至于在“龟兔赛跑”中,乌龟和兔子是否能相遇,就看选的赛道啦。

2023年,祝您兔年快乐、前“兔”似锦、大展宏”兔“。

作者:Java星辰
原文链接:https://juejin.cn/post/7190592456214183992

「兔了个兔」龟兔赛跑——乌龟和兔子能否相遇?相关推荐

  1. 「小虎电商早报」2月24日 苏宁易购北区预计新开零售云门店906家

    [300万+电商人的专属早报] 2月24日,星期四 你的竞争对手都在看: ------------ 1.J&T极兔速递宣布进军拉丁美洲市场 2.eBay第四季度营收26.13亿美元 亏损8.9 ...

  2. 崩坏3服务器维护2月8号,崩坏3 3.9版本「逐暗星辉」更新维护通知

    亲爱的舰长: 为了给舰长更好的游戏体验,休伯利安号将在4月16日进行版本更新维护,维护完成后战舰将更新为3.9版本--「逐暗星辉」. 维护时间 4月16日05:00~12:00 维护时间可能会根据实际 ...

  3. 被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」

    故事的背景如下图,李笑来 老师于10月19日在 知乎Live 开设 一小时建立终生受用的阅读操作系统 的讲座,他老人家看到大家伙报名踊跃,便在微博上发起了一个 猜数量赢取iPhone7 的活动. 因为 ...

  4. 有一种新年味叫「DOU 来云过年」

    年轻人的第一次就地过年. 2021 年的新年印记注定难以磨灭,疫情常态化发展,许多异乡打工人被迫成为「原年人」(减少人员流动,就地过年). 第一次不能回到家乡,独自在工作地过年:第一次不能与父母.亲友 ...

  5. 【新消费创投复盘】中式点心「祥禾饽饽铺」完成过亿元首轮融资;护肤品牌「自然旋律」完成数亿元B轮战略融资

    祥禾饽饽铺完成过亿元首轮融资:自然旋律完成数亿元B轮融资 以下一周投融资复盘内容(10月25日至10月29日)由新消费星球整理. 一.国内投融资 中式点心「祥禾饽饽铺」完成过亿元首轮融资 36氪消息, ...

  6. 首批辉瑞疫苗紧急出仓,传特朗普将「以身试苗」

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来源:Bloomberg 编辑:小匀.QJB [导读]辉瑞公司首批新冠疫苗出仓,据称, ...

  7. 如何设计 Web App 应用架构?「两分钟了解 IOING」

    IOING 在做些什么? IOING 在你的代码和浏览器之间架设了一个中间解释层,该解释层提供了一套新的语法来填补浏览器所不具备的能力. SPA 开发痛点 开发一个 SPA 应用的痛点是不同模块页面的 ...

  8. 「动手学深度学习」在B站火到没谁,加这个免费实操平台,妥妥天花板!

    论 AI 圈活菩萨,非李沐老师莫属. 前有编写「动手学深度学习」,成就圈内入门经典,后又在B站免费讲斯坦福 AI 课,一则艰深硬核讲论文的视频播放量36万,不少课题组从导师到见习本科生都在追番. 如此 ...

  9. AI 领域新突破,腾讯发布首个AI药物研发平台「云深智药」

    7月9日,2020世界人工智能大会云端峰会开幕.会上,腾讯首席运营官任宇昕公布了用AI助力药物研发领域的最新进展--由腾讯自主研发的首个AI驱动的药物发现平台"云深智药(iDrug)&quo ...

最新文章

  1. STM32单片机SIM800C创客GSM短信GPRS可编程模块SDK二次开发DIY
  2. 构建dubbo分布式平台-maven构建ant-framework核心代码annotation
  3. 技术干货 | 视频最佳体验之自适应调节系统
  4. Xftp连接linux(ubuntu)时提示ssh服务器拒绝了密码,请再试一次
  5. 谷歌maps菜单语言设置_Google Maps:拯救未来之路— UX案例研究
  6. 左侧栏下拉框HTML代码,html5下拉菜单代码
  7. 在 iOS 客户端上通过 bitcode 为第三方库修复 bug
  8. koa2 引擎模版html,Koa2模板引擎Ejs使用教程
  9. C++操作符operator的另一种用法
  10. dubbo超时机制原理
  11. 电脑win10黑苹果双系统
  12. 机器学习中的数学——激活函数(一):Sigmoid函数
  13. 爱快路由,通过域名分流解决QQ网吧特权不生效的问题
  14. C#程序设计--控制台程序输出上下三角形和菱形
  15. 详细介绍文本检索基准BEIR: A Heterogeneous Benchmark for Zero-shot Evaluation of Information Retrieval Models
  16. 谢烟客---------Linux之bash编程
  17. 使用ESP8266-01S 作为Station PC作为Server通讯出现 ERROR CLOSED问题的解决办法
  18. mxGraph画图区域使用鼠标滚轮实现放大/缩小
  19. Java常见问题之HashMap扩容、树化、死链
  20. 百鸡百钱python教程_python百钱百鸡

热门文章

  1. Introduction to Graph Neural Network翻译-第六章 图循环网络
  2. 对抗拖延症最直接有效的方法
  3. 【转】这是一篇很完整的元器件选型指南
  4. 水库大坝实时安全监测特点分析
  5. 何学林:房价为什么降不下来?房价上涨的刚性是由强大的利益共同体共同作用的结果(原创首发,深度好文)——何学林房地产大策划之十二
  6. P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap
  7. CC++笔面试知识点
  8. 观看2022年卡塔尔世界杯的感想
  9. python pyecharts 下载生成的render图片 下载背景为黑色
  10. 春分节气介绍PPT模板