• 2.2.1 单链表


    <?php
    header("content-type:text/html;charset=utf-8");
    class List_node{
        /**
         * 单链表基本操作
         *
         *包括
         *1.单链表的初始化 __contruct()
         *2.单链表的创建——头插法
         *3.单链表的创建——尾插法
         *4.单链表的整表删除
         *5.获取单链表中指定位置的数据元素
         *6.在指定位置之前插入一个数据元素
         *7.删除指定位置的数据元素
         */
        private $data;
        private $next;
    
        public function __construct()
        {
            $this->data = null;
            $this->next = null;
        }
        //具有$num个数据元素的单链表的创建——头插法
        public function createListHead($num){
    
            for($i=0;$i<$num;$i++){
                $list_node = new List_node();//生成新的结点
                $list_node->data = rand(0,100);
                $list_node->next = $this->next;
                $this->next = $list_node;//插入到表头
            }
    
        }
    //具有$num个数据元素的单链表的创建——尾插法
        public function createListTail($num){
            $tail=$this;
            for($i=0;$i<$num;$i++){
                $list_node = new List_node();
                $list_node->data = rand(0,100);
                $tail->next = $list_node;//表尾终端结点的指针指向新的结点
                $tail = $list_node;
    
            }
            $list_node->next = null;
        }
    //单链表的整表删除
        public function clearList(){
            $p = $this->next;//p指向第一个结点
            while ($p){      //没有到表尾
                $node=$p->next;
                unset($p);
                $p = $node;
            }
            $this->next=null;
        }
    //返回单链表中指定位置的数据元素
    /*
     * 算法思路:
     * 1.声明指针p指向链表第一个结点,初始化计数器count从1开始
     * 2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,count累加1
     * 3.若到链表末尾p为空,则说明第pos结点不存在
     * 4.否则查找成功,返回结点p的数据
     */
        public function getElem($pos){
            $count=1;//计数器
            $p=$this->next;//p指向链表的第一个指针
            while($p && $count<$pos){//p不为空且计数器还没有达到pos时,循环继续
                $count++;
                $p=$p->next;//让p指向下一个结点
            }
            if(!$p || $pos<$count){
                return 'ERROR';
            }
            return $p->data;//取第pos个结点的数据
        }
        //在指定位置之前插入一个数据元素
        /*
         * 1.声明指针p指向链表头结点,初始化count从1开始
         * 2.当count<pos时,就遍历链表,让p的指针向后移动,不断指向下一个结点,同时count累加1
         * 3.若到链表末尾p为空,则说明第pos个结点不存在
         * 4.否则查找成功,生成一个空结点node
         * 5.单链表插入语句 $node->next = $p->next;$p->next = $node;
         */
        public function listInsert($pos,$elem){
            $p=$this;
            $count=1;
            while($p && $count<$pos){
                $count++;
                $p=$p->next;
            }
            if(!$p || $count>$pos){
                return 'ERROR';
            }
            $node = new List_node();
            $node->data = $elem;
            $node->next = $p->next;
            $p->next = $node;
            return 'OK';
        }
        // 删除指定位置的数据元素
        /*
         * 1.声明指针p指向链表头结点,初始化count从1开始
         * 2.当count<pos时,就遍历链表,让p的指针向后移动,不断指向下一个结点,同时count累加1
         * 3.若到链表末尾p为空,则说明第pos个结点不存在
         * 4.否则查找成功,将欲删除的结点$p->next赋值给q
         * 5.单链表的删除语句$p->next = $q->next;
         * 6.释放q结点
         */
        public function listDelete($pos){
            $p = $this;
            $count = 1;
            while ($p && $count< $pos){
                $count++;
                $p=$p->next;
            }
            if(!$p || $count>$pos){
                return 'ERROR';
            }
            $q = $p->next;
            $p->next = $q->next;
            unset($q);
            return 'OK';
        }
    }
    ?>

    可以参考下图进行操作(截图来自大话数据结构

    头插法:

    尾插法:

    单链表插入:

    单链表删除:

    下面我们就实践一下我们的函数吧

    1.头插法和尾插法的实现

    <?php
    header("content-type:text/html;charset=utf-8");
    include 'list_node.class.php';
    $list_node = new List_node();
    $list_node->createListHead(10);
    print_r($list_node);
    echo ("</br>");
    $list_node->createListTail(10);
    print_r($list_node);
    echo ("</br>");
    
    ?>

    输出结果:

    2.整表删除

    <?php
    header("content-type:text/html;charset=utf-8");
    include 'list_node.class.php';
    $list_node = new List_node();
    $list_node->createListHead(10);
    print_r($list_node);
    echo ("</br>");
    
    $list_node->clearList();
    print_r($list_node);
    echo ("</br>");
    ?>

    输出结果:

    3.获取,插入和删除

    <?php
    header("content-type:text/html;charset=utf-8");
    include 'list_node.class.php';
    $list_node = new List_node();
    $list_node->createListHead(10);
    print_r($list_node);
    echo ("</br>");
    echo ("</br>");
    $e = $list_node->getElem(2);
    echo $e;
    echo ("</br>");
    echo ("</br>");
    $list_node->listInsert(2,666);
    print_r($list_node);
    echo ("</br>");
    echo ("</br>");
    $list_node->listDelete(2);
    print_r($list_node);
    ?>

    输出结果:

  • 相关阅读:
    单页面应用和多页面应用区别及优缺点
    Vue中双向数据绑定是如何实现的?
    vue组件中data为什么必须是一个函数?
    $nextTick的使用
    分别简述computed和watch的使用场景
    webpack结合postcss-loader实现css样式浏览器兼容前缀的添加
    KeyError:‘uid' Python常见错误
    GO语言学习之 跨平台编译
    图表动态选择+图表联动
    软件需求与分析大作业进度八
  • 原文地址:https://www.cnblogs.com/xlzfdddd/p/9807998.html
Copyright © 2020-2023  润新知