php链表笔记:链表的检测
- <?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链表笔记:链表的检测的更多相关文章
- Redis笔记 -- 链表和链表节点的API函数(三)
链表和链表节点API 函数 作用 时间复杂度 listSetDupMethod 将给定的函数设置为链表的节点值复制函数 复制函数可以通过链表的dup属性直接获得,O(1) listGetDupMeth ...
- FreeRTOS数据结构(一)--链表和链表项
结构体定义 /*链表结构体*/ typedef struct xLIST { listFIRST_LIST_INTEGRITY_CHECK_VALUE /*用于链表完整性检查*/ configLIST ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)
链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表. 一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...
- 链表用途&&数组效率&&链表效率&&链表优缺点
三大数据结构的实现方式 数据结构 实现方式 栈 数组/单链表 队列 数组/双端链表 优先级队列 数组/堆/有序链表 双端队列 双向链表 数组与链表实现方式的比较 数组与链表都很快 如果能精确预测栈 ...
- pta 奇数值结点链表&&单链表结点删除
本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode { int data; ListNode *next; ...
- Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表)
Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表) 题目描述 已知一个链表,每次对k个节点进行反转,最后返回反转后的链表 测试样例 Inpu ...
- C# 数据结构 - 单链表 双链表 环形链表
链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...
- php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性)
php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性) 一.总结 链表反转两 ...
- C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)
1.对比单向链表 单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找 单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除 对于单向链表的删除,我们首先要找到单向链表待删除节点的 ...
随机推荐
- web开发者性能优化工具(一)
web开发者性能优化工具 1 数据包嗅探器(在性能优化时,查看页面(包括页面中全部资源)的加载过程) HttpWatch (http://www.httpwatch.com/) 把网络流量用图形的 ...
- 剑指offer——33分行从上到下打印二叉树
题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题解: 使用BFS,按层打印即可 class Solution { public: vector<vector&l ...
- Hadoop节点集群挂了,Hbase数据源损坏怎么办
今天集群节点一下子挂了5台,hbase的数据块也损坏. hadoop日志 .0.15:36642 dest: /ip:50010 2014-08-26 15:01:14,918 WARN org.ap ...
- 批量调用百度地图API获取地址经纬度坐标
1 申请密匙 注册百度地图API:http://lbsyun.baidu.com/index.php?title=webapi 点击左侧 “获取密匙” ,经过填写个人信息.邮箱注册等,成功之后在开放平 ...
- python接口自动化(接口基础)
一.什么是接口? 前端负责展示和收集数据 后端负责处理数据,返回对应的结果 接口是前端与后端之间的桥梁,传递数据的通道 二.
- Fedora25安装mariadb并设置权限
MariaDB版本10.1.21 Fedora版本25 1.Change root user sudo -i 2. dnf install -y mysql dnf install -y mariad ...
- 21个CSS技巧
级联样式表(CSS)在当代Web设计中已经成为重要的环节,如果没有CSS现在的网站将像10年前一样不堪入目.随着CSS技术的普及,越来越多的高质量CSS教程涌入互联网,让我们的学习更加方便. 1.CS ...
- PHP算法之两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元 ...
- bootstrap1总结
bootstrap中的排版----标题: 标题(h1~h6/.h1~.h6) 副标题(small) h1:36px h2:30px h3:24px h4:18px h5:14px h6:12px 排版 ...
- SQLite3与C++的结合应用
SQLite并没有一次性做到位,只有下载这些东西是不能放在vs2010中并马上使用的,下载下来的文件中有sqlite3.c/h/dll/def,还是不够用的.我们需要的sqlite3.lib文件并不在 ...