<?php
/**
* Created by PhpStorm.
* User: huizhou
* Date: 2018/12/2
* Time: 11:48
*/ /**
* 链表的检测
* Class CheckCirclesList
*/ /**
* 单链表类
*/
class Node{
private $next;
private $value; public function __construct($value = null)
{
$this->value = $value;
} public function getValue(){
return $this->value;
} public function setValue($value){
$this->value = $value;
} public function getNext(){
return $this->next;
} public function setNext($next){
$this->next = $next;
} } /**
* 找出带环链表的环的入口结点
* @param Node $pHead
* @return Node
*/
function entryNodeOfLoop(Node $pHead){
$slow = $pHead;
$fast = $pHead; while ($fast != null && $fast->getNext() !=null ){ /**
单链表中环的检测
首先设置两个指针,分别命名为fast和slow,fast指针每次向后移2步,slow指针每次向后移1步。
如果,fast指针最后走到尾结点,则没有环。
如果,fast指针和slow指针相遇,则证明有环。
**/
$slow = $slow->getNext(); // 慢指针走一步
$fast = $fast->getNext()->getNext(); // 快指针走两步 // 快慢指针环内相遇
if($slow === $fast){
// 快指针回到头结点
$fast = $pHead;
// 同一速度再同时走
while ($slow != $fast){
$slow = $slow->getNext();
$fast = $fast->getNext();
} /**
环的起始结点的查询
当fast与slow相遇之后,
fast指针从头结点开始走,每次走1步
当fast再次与slow相遇以后,相遇处的结点为环的入口结点
**/
// 两个相遇的点一定是环的入口
if ($slow == $fast){
return $fast;
}
}
}
} function test(){
// 创建一个带环的链表
$linkList = new Node();
$temp = $linkList; $node1 = new Node('1');
$temp->setNext($node1);
$temp = $node1; $node2 = new Node('2');
$temp->setNext($node2);
$temp = $node2; $node3 = new Node('3');
$temp->setNext($node3);
$temp = $node3; $node4 = new Node('4');
$temp->setNext($node4);
$node4->setNext($node2); // 尾节点指向第二个节点 //打印环
var_dump($linkList); //打印入口节点
$result = entryNodeOfLoop($linkList);
var_dump($result); } 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. 内置Jetty配置JSP支持过程中的常见报错

    目录 1. 常见报错及解决 1.1 JSP support not configured 1.2 JSTL标签解析 1.3 JSP编译 1.4 JSP实现依赖 1.5 EL表达式支持 2. 小结 1. ...

  2. C++之运算符_算数运算符

    运算符 **作用:**用于执行代码的运算 | **运算符类型** | **作用** || -------------- | -------------------------------------- ...

  3. JVM基本知识总结

    大概两三个月之前阅读了<深入理解Java虚拟机>(周志明著),也为了加深印象,这里简单的做下总结,想完整点了解JVM知识的也可以阅读本书,书写的不错,相当通俗易懂. 第一部分 内存管理机制 ...

  4. Linux系统搭建Red5服务器

    Linux系统搭建Red5服务器 Red5 是 支持Windows,Linux等多平台的RTMP流媒体服务器,Windows下搭建相对容易,图形界面操作比较简单,Linux服务器的环境下没有图形界面, ...

  5. Hive应用实例:WordCount

  6. VBA文件对话框的应用(VBA打开文件、VBA选择文件、VBA选择文件夹)

    在VBA中经常要用到文件对话框来进行打开文件.选择文件或选择文件夹的操作.用Microsoft Office提供的文件对话框比较方便.用法如下Application.FileDialog(fileDi ...

  7. 火狐浏览器缓存导致JS已经改变的ID没改变

    问题主要就是火狐浏览器缓存. 比如,自己写一个JS,如下: $(document).ready(function () { $("#bigRoom").live("cli ...

  8. Dom关于位置和尺寸的api

    parentNode    直接父级//和offsetParent不同 inner2.parentNode <!DOCTYPE html> <html id="html&q ...

  9. 阿里云宣布进入 Serverless 容器时代,推出弹性容器实例服务 ECI

    摘要: 阿里云宣布弹性容器实例 ECI(Elastic Container Instance)正式商业化. 为了应对业务高峰,打算提前多久执行ECS扩展?买了ECS虚拟机,容器规格不能完美装箱怎么办? ...

  10. thinkphp 模板布局

    ThinkPHP的模板引擎内置了布局模板功能支持,可以方便的实现模板布局以及布局嵌套功能. 有三种布局模板的支持方式: 第一种方式:全局配置方式 这种方式仅需在项目配置文件中添加相关的布局模板配置,就 ...