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



刚拿到这个题目时,完全是懵的状态。本来这段时间都在做关于链表的题目,但是,真的每个题目都不一样,完全是另外的跟之前的题目大相径庭的。但是,在解题过程中,前面所学到的东西还是有用的。比如:&& 等。

思路:利用链表中有环,如果遍历链表的时候一个指针跑得快,另一个指针跑得慢,总会出现快的追上慢的。当追上的时候,慢的指针所走(从首节点开始)的路径长度一定是出现环的节点的数目。而快的指针所走的路径长度比慢的指针的路径长度一个环的长度。

求入口节点:当第一次慢快指针相遇时,让第三个指针从头开始指向头结点。每次向前走一步。当第三个指针和第第一个指针相遇时的节点即为,环的入口节点。、

代码为:

function EntryNodeOfLoop($pHead)
{
// write code here
if($pHead == null)return $pHead;
$p1 = $pHead;
$p2 = $pHead;
while($p2 && $p1){
$p1 = $p1->next;
$p2 = $p2->next->next;
if($p1 == $p2){
$p3 = $pHead;
while($p1 && $p3){
if($p1 == $p3){
return $p3;
}
//这里特别说明当出现,该链表即为环链表时(第一个节点即为入口节点)
当第一次相遇的地方就是第一节点的地方。
$p1 = $p1->next;
$p3 = $p3->next;
if($p1 == $p3){
return $p3;
}
}
}
}
}

2:该题还有其他解法,到时候再更新。

帮助理解:点击打开链接

更多相关文章

  1. 尝试使用PHP和MySQL获取节点的路径
  2. 如何从一个节点生成exe文件。js应用?
  3. 前端笔记之JavaScript(十)深入JavaScript节点&DOM&事件
  4. js的html元素的父节点,子节点
  5. 不使用chokidar更新所需的节点/快速模块?
  6. 当尝试安装节点时,会得到一个“DLL”错误。js在Windows 7上
  7. contains和compareDocumentPosition 方法来确定是否HTML节点间的
  8. 如何访问远程节点。浏览器中的js应用程序,而不是本地主机
  9. js之DOM操作(访问父节点parentNode)

随机推荐

  1. 获取 + 查看 Android 源码的 方法
  2. android矢量图vector的简单介绍
  3. Android实现动态改变屏幕方向(Landscape &
  4. Android Studio系列教程三--快捷键
  5. Android之音量调节
  6. Android应用程序——四大组件之Activity
  7. 前端和Android / IOS 对接问题
  8. Android坐标系、视图坐标系与触控事件(Mot
  9. Android技术栈
  10. [Android] [Java] 分享 Process 执行命令