设为首页 | 加入收藏
首页 WEB开发
PHPJSPASP.NETJavascriptAJAXjQueryNode.js
编程语言
JavaGolangPythonC++C语言VC++C#
数据库
MySQLMSSQLSQLiteMongoDBRedisAccess存储技术
前端开发
HTML+DIV+CSSFlash网页制作技巧
站长之家
建站技巧网络赚钱网站安全
免费资源
开发总结视频教程IDE开发手册面试题
在线工具
Unicode编码 UTF-8编码 URL编码/解码 Unix时间戳 大小写转换 JS代码混淆 JS解密
WEB开发 > PHP >

PHP实现找出链表中环的入口节点

发布时间:2019-09-28 | 阅读次数:1041

本文实例讲述了PHP实现找出链表中环的入口节点。分享给大家供大家参考,具体如下:

问题

一个链表中包含环,请找出该链表的环的入口结点。

解决思路

第一步,找环中相汇点。分别用p1,p2指向链表头部,p1每次走一步,p2每次走二步,直到p1==p2找到在环中的相汇点。
第二步,找环的入口。接上步,当p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,设环中有n个节点,p2比p1多走一圈有2x=n+x; n=x;可以看出p1实际走了一个环的步数,再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入口。(还没怎么懂)

实现代码

<?php
/*class ListNode{
  var $val;
  var $next = NULL;
  function __construct($x){
    $this->val = $x;
  }
}*/
function EntryNodeOfLoop($pHead)
{
  if($pHead == null || $pHead->next == null)
    return null;
  $p1 = $pHead;
  $p2 = $pHead;
  while($p2!=null && $p2->next!=null){
    $p1 = $p1->next;
    $p2 = $p2->next->next;
    if($p1 == $p2){
      $p2 = $pHead;
      while($p1!=$p2){
        $p1 = $p1->next;
        $p2 = $p2->next;
      }
      if($p1 == $p2)
        return $p1;
    }
  }
  return null;
}

上一篇:PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
下一篇:thinkphp 中的volist标签在ajax操作中的特殊性(推荐)