zoukankan      html  css  js  c++  java
  • 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);
    ?>

    输出结果:

  • 相关阅读:
    Day 20 初识面向对象
    Day 16 常用模块
    Day 15 正则表达式 re模块
    D14 模块 导入模块 开发目录规范
    Day 13 迭代器,生成器,内置函数
    Day 12 递归,二分算法,推导式,匿名函数
    Day 11 闭包函数.装饰器
    D10 函数(二) 嵌套,命名空间作用域
    D09 函数(一) 返回值,参数
    Day 07 Day08 字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/xlzfdddd/p/9807998.html
Copyright © 2011-2022 走看看