当前位置 博文首页 > 文章内容

    浅谈PHP中实现并处理链表的方法

    作者:shunshunshun18 栏目:未分类 时间:2021-03-03 10:44:39

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    本篇文章给大家介绍一下PHP中实现并处理链表的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

    【推荐学习:《》】

    链表

    链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。

    形式:单链表、双链表、跳表(redis 集合数据结构就是跳表实现,时间复杂度O(log N))

    跳表了解:https://lotabout.me/2018/skip-list/

    php实现对链表的增删改查操作

    定义节点类:

    <?php
    class Node
    {
        public $val;
        public $next;
    
    
    
        public function __construct( $val = null, $next = null )
        {
            $this->val  = $val;
            $this->next = $next;
        }
    
    
    }

    链表类:

    <?php
    /**链表
     * Class Linklist
     * @package app\models
     */
    class Linklist
    {
        public $head;           //头节点(默认一个虚拟头节点)
        public $size;           //长度
    
        public function __construct()
        {
            $this->head = new Node();
            $this->size  = 0;
        }
    
        //头插法
        public function addFirst( $value ){
    //        $node = new Node($value);
    //        $node->next = $this->head;
    //        $this->head = $node;
    
            //简化
    //        $this->head = new Node( $value, $this->head );
    //        $this->size++;
    
            $this->add(0,$value);
        }
    
        /**指定索引位置插入
         * @param $index
         * @param $value
         * @throws Exception
         */
        public function add( $index, $value ){
    
            if( $index > $this->size )
                throw new Exception('超过链表范围');
    
    //        if( $index==0 ){
    //            $this->addFirst($value);
    //        }else{
                $prev = $this->head;
                for($i=0;$i<$index;$i++){
                    $prev = $prev->next;
                }
    
    //            $node = new Node($value);
    //            $node->next = $prev->next;
    //            $prev->next = $node;
    
                $prev->next = new Node($value,$prev->next);
    //        }
    
            $this->size++;
        }
    
        /**尾插法
         * @param $value
         */
        public function addLast( $value ){
    
            $this->add($this->size,$value);
    
        }
    
    
        /***
         * 编辑
         * @param $index
         * @param $value
         * @throws Exception
         */
        public function edit( $index, $value ){
            if( $index > $this->size-1 )
                throw new Exception('超过链表范围');
    
            $prev = $this->head->next;
            for($i=0;$i<=$index;$i++){
                if( $i==$index )
                    $prev->val = $value;
                $prev = $prev->next;
            }
    
        }
    
        /**
         * 查询
         * @param $index
         * @return null
         * @throws Exception
         */
        public function select($index){
            if( $index > $this->size-1 )
                throw new Exception('超过链表范围');
    
            $prev = $this->head->next;
            for($i=0;$i<=$index;$i++){
                if( $i==$index )
                    return $prev;
                $prev = $prev->next;
            }
        }
    
    
        /**删除
         * @param $index
         * @throws Exceptionr
         */
        public function delete( $index ){
            if( $index > $this->size-1 )
                throw new Exception('超过链表范围');
    
            $prev = $this->head;
            for($i=0;$i<=$index;$i++){
                if( $i==$index )
                   $prev->next = $prev->next->next;
                $prev = $prev->next;
            }
            $this->size--;
        }
    
        /**检索值是否存在
         * @param $value
         * @return bool
         */
        public function iscontain( $value ){
            $prev = $this->head->next;
            while( $prev ){
    
                if( $prev->val==$value ){
                    return true;
                }
                $prev = $prev->next;
            }
    
            return false;
        }
    
        /**转换为字符串
         * @return string
         */
        public function tostring(){
    
            $prev = $this->head->next;
    
            $r = [];
            while( $prev ){
                $r[] = $prev->val;
                $prev = $prev->next;
            }
            return implode('->',$r);
    
        }
        
         /**
          * 删除指定的节点值
          * @param $value
          */
          public function removeFileds( $value ){
               $prev = $this->head;
               while( $prev->next ){
                   if( $prev->val == $value ){
                       $prev->val = $prev->next->val;
                       $prev->next = $prev->next->next;
                   }else{
                       $prev = $prev->next;
                   }
               }
          }
          
           /**
            * 通过递归方式删除指定的节点值
            * @param $value
            */
           public function removeFiledsByRecursion( $value ){
               $this->head = $this->removeByRecursion( $this->head ,$value);
               return $this->head;
           }
       
            public function removeByRecursion( $node , $value, $level=0 ){
                   if( $node->next == null ){
                       $this->showDeeep($level,$node->val);
                       return $node->val == $value ? $node->next:$node;
                   }
           
                   $this->showDeeep($level,$node->val);
                   $node->next = $this->removeByRecursion( $node->next,$value,++$level );
                   $this->showDeeep($level,$node->val);
                   return $node->val == $value ? $node->next:$node;
               }
           
            /**
            * 显示深度
            * 帮助理解递归执行过程,回调函数执行层序遵循系统栈 
            * @param int $level 深度层级
            * @param $val
            * @return bool
            */
            public function showDeeep( $level=1,$val ){
                 if( $level<1 ){
                     return false;
                 }
        
                 while($level--){
                     echo '-';
                 }
                 echo "$val\n";
            }
    
    }

    调用操作如下:

    <?php
    $node = new Linklist();
    $node->addFirst(1);
    $node->add(1,7);
    $node->add(2,10);
    $node->edit(1,8);
    var_dump($node->select(1)) ;
    $node->delete(1);
    $node->addLast(99);
    var_dump($node->iscontain(2));
    var_export($node);
    var_export($node->tostring());

    分析下链表操作的时间复杂度:

    增: O(n)  只对链表头操作:O(1)
    
    删: O(n)  只对链表头操作:O(1)
    
    改:O(n)
    
    查:O(n)   只对链表头操作:O(1)

    利用链表实现栈

    <?php
    /**
     * 链表实现栈
     * Class LinklistStack
     * @package app\models
     */
    class LinklistStack extends Linklist
    {
        /**
         * @param $value
         */
        public function push( $value ){
            $this->addFirst($value);
        }
    
        /**
         * @return mixed
         */
        public function pop(){
            $r = $this->head->next->val;
            $this->delete(0);
            return $r;
        }
    }
    <?php
            $stack = new LinklistStack();
            $stack->push(1);
            $stack->push(3);
            $stack->push(6);
            $stack->push(9);
    
            print_r($stack->pop());
            print_r($stack->head);

    链表实现队列

    image

    <?php
    
    /**
     * 链表实现队列
     * Class LinkListQueue
     * @package app\models
     */
    class LinkListQueue extends Linklist
    {
        public $tail;    //尾节点
    
        /**
         * push
         * @param $value
         */
        public function push( $value ){
    
            if( $this->head->val==null ){
                $this->tail = new Node( $value );
                $this->head = $this->tail;
            }else{
                $this->tail->next =  new Node( $value );
                $this->tail = $this->tail->next;
            }
            $this->size++;
        }
    
        /**
         * pop
         * @return null
         * @throws \Exception
         */
        public function pop(){
            if( $this->size<=0 )
                throw new \Exception('超过链表范围');
            $val = $this->head->val;
            $this->head = $this->head->next;
    
            $this->size--;
            return $val;
        }
    
        /**
         * 查看队首
         */
        public function checkHead(){
            return $this->head->val;
        }
    
        /**
         * 查看队尾
         */
        public function checkEnd(){
            return $this->tail->val;
        }
    
        /**
         * toString
         */
        public function toString(){
            $r = [];
            while( $this->head ){
                $r[] = $this->head->val;
                $this->head = $this->head->next;
            }
            return implode('->',$r);
        }
    }

    测试

    <?php
    $stack = new LinkListQueue();
            $stack->push(1);
            $stack->push(3);
            $stack->push(6);
            $stack->push(9);
    
            print_r($stack->pop());
            print_r($stack->head);
            print_r($stack->checkHead());
            print_r($stack->checkEnd());
            print_r($stack->toString());
    /**        
    1
    app\models\Node Object
    (
        [val] => 3
        [next] => app\models\Node Object
            (
                [val] => 6
                [next] => app\models\Node Object
                    (
                        [val] => 9
                        [next] => 
                    )
    
            )
    
    )
    3
    9
    3->6->9
    **/

    更多编程相关知识,请访问:!!