1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: huizhou
  5. * Date: 2018/12/2
  6. * Time: 11:48
  7. */
  8.  
  9. /**
  10. * 链表的检测
  11. * Class CheckCirclesList
  12. */
  13.  
  14. /**
  15. * 单链表类
  16. */
  17. class Node{
  18. private $next;
  19. private $value;
  20.  
  21. public function __construct($value = null)
  22. {
  23. $this->value = $value;
  24. }
  25.  
  26. public function getValue(){
  27. return $this->value;
  28. }
  29.  
  30. public function setValue($value){
  31. $this->value = $value;
  32. }
  33.  
  34. public function getNext(){
  35. return $this->next;
  36. }
  37.  
  38. public function setNext($next){
  39. $this->next = $next;
  40. }
  41.  
  42. }
  43.  
  44. /**
  45. * 找出带环链表的环的入口结点
  46. * @param Node $pHead
  47. * @return Node
  48. */
  49. function entryNodeOfLoop(Node $pHead){
  50. $slow = $pHead;
  51. $fast = $pHead;
  52.  
  53. while ($fast != null && $fast->getNext() !=null ){
  54.  
  55. /**
  56. 单链表中环的检测
  57. 首先设置两个指针,分别命名为fast和slow,fast指针每次向后移2步,slow指针每次向后移1步。
  58. 如果,fast指针最后走到尾结点,则没有环。
  59. 如果,fast指针和slow指针相遇,则证明有环。
  60. **/
  61. $slow = $slow->getNext(); // 慢指针走一步
  62. $fast = $fast->getNext()->getNext(); // 快指针走两步
  63.  
  64. // 快慢指针环内相遇
  65. if($slow === $fast){
  66. // 快指针回到头结点
  67. $fast = $pHead;
  68. // 同一速度再同时走
  69. while ($slow != $fast){
  70. $slow = $slow->getNext();
  71. $fast = $fast->getNext();
  72. }
  73.  
  74. /**
  75. 环的起始结点的查询
  76. 当fast与slow相遇之后,
  77. fast指针从头结点开始走,每次走1步
  78. 当fast再次与slow相遇以后,相遇处的结点为环的入口结点
  79. **/
  80. // 两个相遇的点一定是环的入口
  81. if ($slow == $fast){
  82. return $fast;
  83. }
  84. }
  85. }
  86. }
  87.  
  88. function test(){
  89. // 创建一个带环的链表
  90. $linkList = new Node();
  91. $temp = $linkList;
  92.  
  93. $node1 = new Node('1');
  94. $temp->setNext($node1);
  95. $temp = $node1;
  96.  
  97. $node2 = new Node('2');
  98. $temp->setNext($node2);
  99. $temp = $node2;
  100.  
  101. $node3 = new Node('3');
  102. $temp->setNext($node3);
  103. $temp = $node3;
  104.  
  105. $node4 = new Node('4');
  106. $temp->setNext($node4);
  107. $node4->setNext($node2); // 尾节点指向第二个节点
  108.  
  109. //打印环
  110. var_dump($linkList);
  111.  
  112. //打印入口节点
  113. $result = entryNodeOfLoop($linkList);
  114. var_dump($result);
  115.  
  116. }
  117.  
  118. test();

php链表笔记:链表的检测的更多相关文章

  1. Redis笔记 -- 链表和链表节点的API函数(三)

    链表和链表节点API 函数 作用 时间复杂度 listSetDupMethod 将给定的函数设置为链表的节点值复制函数 复制函数可以通过链表的dup属性直接获得,O(1) listGetDupMeth ...

  2. FreeRTOS数据结构(一)--链表和链表项

    结构体定义 /*链表结构体*/ typedef struct xLIST { listFIRST_LIST_INTEGRITY_CHECK_VALUE /*用于链表完整性检查*/ configLIST ...

  3. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  4. 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)

    链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表.   一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...

  5. 链表用途&&数组效率&&链表效率&&链表优缺点

    三大数据结构的实现方式 数据结构 实现方式 栈  数组/单链表 队列  数组/双端链表 优先级队列 数组/堆/有序链表 双端队列 双向链表 数组与链表实现方式的比较 数组与链表都很快 如果能精确预测栈 ...

  6. pta 奇数值结点链表&&单链表结点删除

    本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode { int data; ListNode *next; ...

  7. Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表)

    Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表) 题目描述 已知一个链表,每次对k个节点进行反转,最后返回反转后的链表 测试样例 Inpu ...

  8. C# 数据结构 - 单链表 双链表 环形链表

    链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...

  9. php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性)

    php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性) 一.总结 链表反转两 ...

  10. C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)

    1.对比单向链表 单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找 单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除 对于单向链表的删除,我们首先要找到单向链表待删除节点的 ...

随机推荐

  1. web开发者性能优化工具(一)

    web开发者性能优化工具 1   数据包嗅探器(在性能优化时,查看页面(包括页面中全部资源)的加载过程) HttpWatch (http://www.httpwatch.com/) 把网络流量用图形的 ...

  2. 剑指offer——33分行从上到下打印二叉树

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.   题解: 使用BFS,按层打印即可 class Solution { public: vector<vector&l ...

  3. Hadoop节点集群挂了,Hbase数据源损坏怎么办

    今天集群节点一下子挂了5台,hbase的数据块也损坏. hadoop日志 .0.15:36642 dest: /ip:50010 2014-08-26 15:01:14,918 WARN org.ap ...

  4. 批量调用百度地图API获取地址经纬度坐标

    1 申请密匙 注册百度地图API:http://lbsyun.baidu.com/index.php?title=webapi 点击左侧 “获取密匙” ,经过填写个人信息.邮箱注册等,成功之后在开放平 ...

  5. python接口自动化(接口基础)

    一.什么是接口? 前端负责展示和收集数据 后端负责处理数据,返回对应的结果 接口是前端与后端之间的桥梁,传递数据的通道 二.

  6. Fedora25安装mariadb并设置权限

    MariaDB版本10.1.21 Fedora版本25 1.Change root user sudo -i 2. dnf install -y mysql dnf install -y mariad ...

  7. 21个CSS技巧

    级联样式表(CSS)在当代Web设计中已经成为重要的环节,如果没有CSS现在的网站将像10年前一样不堪入目.随着CSS技术的普及,越来越多的高质量CSS教程涌入互联网,让我们的学习更加方便. 1.CS ...

  8. PHP算法之两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元 ...

  9. bootstrap1总结

    bootstrap中的排版----标题: 标题(h1~h6/.h1~.h6) 副标题(small) h1:36px h2:30px h3:24px h4:18px h5:14px h6:12px 排版 ...

  10. SQLite3与C++的结合应用

    SQLite并没有一次性做到位,只有下载这些东西是不能放在vs2010中并马上使用的,下载下来的文件中有sqlite3.c/h/dll/def,还是不够用的.我们需要的sqlite3.lib文件并不在 ...