• [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
    <?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*
        }
      }
    }
  • 相关阅读:
    spring使用中ModelAttribute的内容被覆盖
    html中,纯数字或纯英文的一串字符超出父容器不会折行显示,如何解决?
    js实现刷新页面出现随机背景图
    为tomcat配置项目必须的引擎文件
    mysql如何出查出最近7天,最近30天,最近n天的记录?
    为了显示此页面,Firefox 必须发送将重复此前动作的数据(例如搜索或者下订单)
    git 恢复到旧版本命令
    七大经典排序算法总结(C语言描述)
    C语言描述栈的实现及操作(链表实现)
    C语言的文件读写操作函数小结
  • 原文地址:https://www.cnblogs.com/taoshihan/p/9631637.html
Copyright © 2020-2023  润新知