`

php实现单链表(静态链表)

阅读更多
<?php
    /*
     * 单链表的PHP实现
     *
     * @author zhaojiangwei
     * @since 2011/10/20
     */

    //结点类
    class Node{
        private $next = NULL; //下一个结点指针
        private $data = NULL; //数据
   
        public function Node($data, $next = NULL){
            $this->data = $data;
            $next && $this->next = $next;
        }
        public function getData(){
            return $this->data;
        }
        public function setData($data){
            $this->data = $data;
        }
        public function getNext(){
            return $this->next;
        }
        public function setNext($next){
            $this->next = $next;
        }
    }

    //单链表类
    class LinkList{
        private $data_list = NULL; //结点集          

        public function LinkList($data = false){
            $this->data_list = array();
            $title = new Node(NULL);
            $this->data_list[] = $title;
          
            if($data){
                if(is_array($data)){
                    $this->addMoreData($data);
                }else{
                    $this->addData($data);
                }
            }
        }
        //返回第N个结点的值
        public function getNodeByNumber($number){
            return $this->data_list[$this->findKeyByNumber($number)]->getData();
        }
        //添加一组结点
        public function addMoreData($datas){
            foreach($datas as $value){
                $this->addData($value);
            }
        }
        //添加结点统一入口,供外面调用
        //$number 添加在第几个结点的后面
        public function addData($data, $number = false){
            $node = new Node($data);
            if($number === FALSE || $number == count($this->data_list)){
                $this->insertLastNode($node);
            }elseif($number > count($this->data_list)){
                return false;
            }else{
                $this->insertNode($node, $number);
            }
        }
        //插入一个结点到最后
        private function insertLastNode($node){
                $node->setNext(NULL);             
                $lastKey = $this->findLastNode();
                $insert_key = $this->insertNodeIntoArray($node);
                $this->data_list[$lastKey]->setNext($insert_key);
        }    
        //插入一个结点
        private function insertNode($node, $number){
            $insert_number = $this->findKeyByNumber($number);    
            $node->setNext($this->data_list[$insert_number]->getNext());
            $insert_key = $this->insertNodeIntoArray($node);
            $this->data_list[$insert_number]->setNext($insert_key);
        }
        //查找第N个结点对应的数组key
        private function findKeyByNumber($number){
            $i = $key = 0;

            while($i < $number){
                $key = $this->data_list[$key]->getNext();
                $i ++;
            }
         
            return $key;
        }
        //将结点加入数组
        private function insertNodeIntoArray($node){
            $this->data_list[] = $node;     
            return $this->getLastKey();
        }
        //删除结点
        public function deleteNode($number){
            if($number == 0 || $number > count($this->data_list)){
                return false;
            }

            $pre_key = $this->findKeyByNumber($number - 1);
            $key = $this->data_list[$pre_key]->getNext();

          $this->data_list[$pre_key]->setNext($this->data_list[$key]->getNext());
            unset($this->data_list[$key]);
        }

        //查找某结点的前一个结点
        private function getPreNodeKey($key){
            foreach($this->data_list as $k=>$v){
                if($v->getNext() == $key){
                    return $k;  
                }
            }
            return false;
        }

        //打印链表
        public function getData_list(){
            return $this->data_list;
        }

        //返回数组的最后一个键
        private function getLastKey(){
            end($this->data_list);
            return key($this->data_list);
        }

        //判断某个键值是否存在
        private function ifExistKey($key){
            if(array_key_exists($key, $this->data_list)){
                return true;
            }          
            return false;
        }
        //查找尾结点
        public function findLastNode(){
            foreach($this->data_list as $key=>$value){
                if($value->getNext() === NULL){
                    return $key;
                }
            }
        }
    }
?>
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    在PHP中实现使用单链表

    在PHP中实现单链表 一、 开发环境 1、环境搭建:Windows 7+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0。 2、文本编辑器:Sublime 3。 二、主要技术 本案例主要在PHP中通过面向对象的程序设计思想来实现单链表的数据结构...

    链表-使用PHP实现的单链表数据结构.zip

    PHP中实现链表需要定义一个节点类,通常包含两个属性:`data`(用于存储数据)和`next`(用于链接到下一个节点)。下面是一个简单的PHP单链表节点类的示例: ```php class Node { public $data; public $next; ...

    在PHP中实现单链表1

    单链表中数据元素之间的逻辑关系是由结点中的指针指示的,换句话说,指针为数据元素之间的逻辑关系的映像,则逻辑上相邻的两个元素其存储的物理位置不要求紧邻,因此,这种

    PHP实现单链表翻转操作示例

    以上代码段展示了如何在PHP中定义单链表,以及如何实现链表的翻转。运行test()函数后,可以看到链表被成功翻转。此外,文中还提到了一些PHP相关的数据结构和算法教程,对于深入学习PHP编程语言会有很大的帮助。

    php实现单链表的实例代码

    在这个PHP实现的单链表实例中,我们主要关注以下几个关键点: 1. **链表节点类(Node)**:这是单链表的基本组成单元。类`node`定义了三个属性:`$id`表示节点的唯一标识,`$name`存储节点的名称,`$next`是一个...

    链表-使用PHP实现的双向链表数据结构.zip

    在本案例中,"链表-使用PHP实现的双向链表数据结构.zip" 是一个压缩文件,其中包含了一个使用PHP语言实现的双向链表数据结构的示例。双向链表是链表的一种变体,与单向链表不同,它允许从两个方向遍历链表。每个节点...

    浅谈PHP链表数据结构(单链表)_.docx

    在PHP中,虽然其底层是C语言,但PHP提供了一种面向对象的方式来实现链表。我们可以通过定义一个类,例如`Hero`,来创建链表的节点。`Hero`类有四个成员属性:排名`$no`、姓名`$name`、昵称`$nickname`以及一个指向下...

    PHP单链表的实现代码

    总结来说,PHP单链表的实现主要涉及节点类的定义,以及对链表进行增、删、改、查的一系列方法。通过掌握这些基本概念和操作,程序员可以在实际项目中有效地利用链表解决各种问题。对于那些对数据结构和算法感兴趣的...

    php实现页面静态化

    ### PHP 实现页面静态化详解 #### 一、概述 在现代Web开发中,提高网站性能和用户体验至关重要。其中一种常见的方法就是实现页面静态化。本文将详细介绍如何使用 PHP 来实现页面静态化,包括纯静态化和伪静态化两...

    链表-使用PHP实现的循环链表数据结构.zip

    总结来说,循环链表是一种非连续存储数据的结构,使用PHP实现时,可以通过定义节点类和链表类来创建、操作循环链表。通过这种方式,我们可以灵活地处理动态数据集,实现如插入、删除、遍历等功能。

    PHP实现使用页面静态化

    PHP实现页面静态化 一、 开发环境 1、环境搭建:Windows 7+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0。 2、文本编辑器:Sublime 3。 二、主要技术 本案例主要使用PHP 7中的文件读写功能与ob缓存机制实现纯静态页面的...

    php单链表实现代码分享

    在本文中,我们将深入探讨如何使用PHP实现单链表数据结构。单链表是一种线性数据结构,每个元素(节点)包含数据和指向下一个元素的指针。在PHP中,由于其动态类型特性,我们可以方便地模拟链表的实现。 首先,我们...

    PHP实现链表的定义与反转功能示例

    《PHP实现链表的定义与反转功能详解》 在编程领域,链表是一种常见的数据结构,它由一系列节点构成,每个节点包含数据和指向下一个节点的引用。在PHP中,虽然数组是常用的存储数据的方式,但理解并实现链表的概念...

    php实现伪静态的方法(实用全面)

    PHP作为广泛使用的服务器端脚本语言,有着丰富的功能来实现伪静态。本文将深入探讨PHP实现伪静态的多种方法,并提供实用全面的解决方案。 1. **URL重写** URL重写是实现伪静态最常用的方法,通过Apache或Nginx...

    PHP小教程之实现双向链表

    在本篇《PHP小教程之实现双向链表》中,我们将深入探讨如何使用PHP来创建和操作双向链表。双向链表是一种数据结构,每个节点不仅包含数据,还包含两个指针,一个指向前一个节点(`$pre`),另一个指向后一个节点(`$...

    PHP简单实现循环链表功能示例

    循环链表是数据结构中的一种链式存储结构,在PHP中也可以实现这一结构。在循环链表中,最后一个节点的指针指向链表的头节点,从而形成一个环状结构,使得在遍历到链表尾部时,还能继续回到链表的头部,继续遍历。 ...

    PHP实现页面静态化1

    【PHP实现页面静态化】是提高网站性能的重要手段,它将动态内容转化为静态HTML文件,减少服务器处理负担,提升用户体验。本案例主要介绍如何在PHP 7环境下进行页面静态化,包括纯静态化和伪静态化的实现。 一、开发...

    php伪静态实现方法

    实现PHP伪静态的方法主要有两种:URL重写和修改内部请求流程。 1. **URL重写**: - 使用Apache服务器,可以借助`mod_rewrite`模块进行URL重写。首先,在`.htaccess`文件中配置规则,例如: ``` RewriteEngine On...

Global site tag (gtag.js) - Google Analytics