[PHP] 算法-请找出带环链表的环的入口结点的PHP实现
程序员文章站
2023-11-17 23:07:52
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点。第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了 2.原理有点像上面的,定义... ......
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点。第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了 2.原理有点像上面的,定义两个指针,一个是快指针每次走两步,一个是慢指针每次走一步,当两个相遇的时候,假设环的长度为n个结点,慢指针走x步,快指针走2x步,2x=x+kn ;x=kn; k暂时假定为1圈 ,也就是慢指针slow走了一个环的距离 3.快指针回到头结点,慢指针原位置不动,两个每次都是走一步,当两个再次相遇的时候,就是在环入口;想象把环捋直,和倒数第k个结点很像了 slow fast while fast!=null && fast->next!=null slow=slow->next fast=fast->next->next if slow==fast fast=head while slow!=fast slow=slow->next fast=fast->next if slow==fast return slow return null
<?php class node{ public $data; public $next; public function __construct($data=""){ $this->data=$data; } } //构造一个带环的链表 $linklist=new node(); $linklist->next=null; $temp=$linklist; $node1=new node("111"); $temp->next=$node1; $temp=$node1; $node2=new node("222"); $temp->next=$node2; $temp=$node2; $node3=new node("333"); $temp->next=$node3; $temp=$node3; $node4=new node("444"); $temp->next=$node4; $node4->next=$node2;//尾结点指向第二个结点 function entrynodeofloop($phead){ $slow=$phead; $fast=$phead; while($fast!=null && $fast->next!=null){ $slow=$slow->next;//慢指针走一步 $fast=$fast->next->next;//快指针走两步 //快慢指针环内相遇 if($slow==$fast){ //快指针回到头结点 $fast=$phead; //同一速度再同时走 while($slow!=$fast){ $slow=$slow->next; $fast=$fast->next; } //两个相遇的点一定是环的入口 if($slow==$fast){ return $fast; } } } } var_dump($linklist); $result=entrynodeofloop($linklist); var_dump($result);
object(node)#1 (2) { ["data"]=> string(0) "" ["next"]=> object(node)#2 (2) { ["data"]=> string(3) "111" ["next"]=> object(node)#3 (2) { ["data"]=> string(3) "222" ["next"]=> object(node)#4 (2) { ["data"]=> string(3) "333" ["next"]=> object(node)#5 (2) { ["data"]=> string(3) "444" ["next"]=> *recursion* } } } } } object(node)#3 (2) { ["data"]=> string(3) "222" ["next"]=> object(node)#4 (2) { ["data"]=> string(3) "333" ["next"]=> object(node)#5 (2) { ["data"]=> string(3) "444" ["next"]=> *recursion* } } }
推荐阅读
-
[PHP] 算法-删除链表中重复的结点的PHP实现
-
[PHP] 算法-请找出带环链表的环的入口结点的PHP实现
-
PHP实现找出链表中环的入口节点
-
PHP实现找出链表中环的入口节点
-
[PHP] 算法-请找出带环链表的环的入口结点的PHP实现
-
[PHP] 算法-删除链表中重复的结点的PHP实现
-
[PHP] 算法-找出两个链表的第一个公共结点的PHP实现
-
c++ 刷题 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。心得
-
【算法/剑指Offer】给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
-
牛客网刷题java之给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。