這篇文章帶給大家的內容是關於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
<?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中文網其他相關文章!