加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php找出环链表入口结点

发布时间:2020-05-30 19:32:51 所属栏目:PHP 来源:互联网
导读:本文章向大家介绍[PHP] 算法-请找出带环链表的环的入口结点的PHP实现 ,需要的朋友可以参考一下

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出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

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*

}

}

}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读