PHP 判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即P点

答案

  1. class Node
  2. {
  3. public $data=null;
  4. public $next=null;
  5. }
  6. function eatList(Node $node)
  7. {
  8. $fast = $slow = $node;
  9. $first_target = null;
  10. if($node->data == null) {
  11. return false;
  12. }
  13. while (true) {
  14. if($fast->next != null && $fast->next->next != null) {
  15. $fast = $fast->next->next; // 快指针一次走两步
  16. $slow = $slow->next; // 慢指针一次走一步
  17. } else {
  18. return false;
  19. }
  20. if($fast == $slow) { // 慢指针追上快指针,说明有环
  21. $p1 = $node; // p1指针指向head节点,p2指针指向它们第一次相交的点,
  22. // 然后两个指针每次移动一步,当它们再次相交,即为环的入口
  23. $p2 = $fast;
  24. while($p1 != $p2) {
  25. $p1 = $p1->next;
  26. $p2 = $p2->next;
  27. }
  28. return $p1; // 环的入口节点
  29. }
  30. }
  31. }