文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP实现链表的方法

2023-06-15 02:51

关注

这篇文章主要介绍了PHP实现链表的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

链表

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

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

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

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

定义节点类:

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

链表类:

<?phpclass 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);    }        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++;    }        public function addLast( $value ){        $this->add($this->size,$value);    }        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;        }    }        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;        }    }        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--;    }        public function iscontain( $value ){        $prev = $this->head->next;        while( $prev ){            if( $prev->val==$value ){                return true;            }            $prev = $prev->next;        }        return false;    }        public function tostring(){        $prev = $this->head->next;        $r = [];        while( $prev ){            $r[] = $prev->val;            $prev = $prev->next;        }        return implode('->',$r);    }               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;               }           }      }                    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;           }                       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)

利用链表实现栈

<?phpclass LinklistStack extends Linklist{        public function push( $value ){        $this->addFirst($value);    }        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);

链表实现队列

PHP实现链表的方法

<?phpclass LinkListQueue extends Linklist{    public $tail;    //尾节点        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++;    }        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;    }        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());

php有什么用

php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Perl以及php自创新的语法,主要用来做网站开发,许多小型网站都用php开发,因为php是开源的,从而使得php经久不衰。

感谢你能够认真阅读完这篇文章,希望小编分享的“PHP实现链表的方法”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯