zoukankan      html  css  js  c++  java
  • PHP算法学习(7) 双向链表 实现栈

    2019年2月25日17:24:34

    final class BasicNode {
    
        public $index;
        public $data;
        public $next = null;
        public $pre = null;
    
        public function __construct($index, $data) {
            $this->index = $index;
            $this->data = $data;
        }
    
    }
    <?php
    
    /*
     * 双向链表
     */
    
    final class DoublyLinkedList {
    
        //从链表尾部压入一个节点,节点自动维护,不需要要像main方法那样自己维护
        public function add(BasicNode $head, BasicNode $Node) {
            $current = $head; //让$current指向$head;
            //顺序联表根据index排序
            while ($current->next != null) {
                //head元素为空,从第一个有数据元素开始检测
                if ($current->next->index > $Node->index) {//如果有相同的index就不能插入
                    break;
                    //$current没有 next元素
                } elseif ($current->next->index == $Node->index) {
                    throw new Exception('index重复');
                }
                $current = $current->next;
            }
    //        p($current);
            //没有元素,和尾部插入元素
            //中间插入情况
            if ($current->next != null) {
                $Node->next = $current->next;
            }
            $Node->pre = $current;
            if ($current->next != null) {
                $current->next->pre = $Node;
            }
            $current->next = $Node;
        }
    
        //从链表尾压出一个节点
        public function delete(BasicNode $head, $index) {
            $current = $head; //让$current指向$head;
            $has = false;
            while ($current->next != null) {
                //提前查找链表尾部是否为空,为空就是尾部,吧当前节点的next复制问NULL,就是尾部元素干掉
                if ($current->next->index == $index) {
                    $has = true;
                    break;
                }
                $current = $current->next;
            }
            if (!$has) {
                throw new Exception('index没有找到');
            }
            if ($current->next != null) {
                $current->next->pre = $current;
            }
            $current->next = $current->next->next;
        }
    
        //修改数据
        public function update(BasicNode $head, $index, $data) {
            $current = $head; //让$current指向$head;
            $has = false;
            while ($current->next != null) {
                if ($current->next->index == $index) {
                    $has = true;
                    break;
                }
                $current = $current->next;
            }
            if (!$has) {
                throw new Exception('index没有找到');
            }
            $current->next->data = $data;
        }
    
    }

    测试代码

    $head = new BasicNode(null, []);
    $a = new BasicNode(1, ['a']);
    $b = new BasicNode(5, ['b']);
    $c = new BasicNode(8, ['c']);
    $d = new BasicNode(99, ['d']);
    $e = new BasicNode(66, ['e']);
    
    //if ($head->next->index > 1) {
    //    pp('大于');
    //} else {
    //    pp('小于');
    //}
    
    $DoublyLinkedList = new DoublyLinkedList();
    $DoublyLinkedList->add($head, $b);
    //pp($head);
    $DoublyLinkedList->add($head, $a);
    //pp($head);
    $DoublyLinkedList->add($head, $d);
    $DoublyLinkedList->add($head, $e);
    
    $DoublyLinkedList->add($head, $c);
    
    //$DoublyLinkedList->update($head, 5, ['2312321']);
    $DoublyLinkedList->delete($head, 99);
    pp($head);

    最麻烦的是新增的时候去维护互相连接的中间节点

  • 相关阅读:
    解决Ubuntu19.04无法安装SecureCRT
    gluster学习(二)
    gluster学习(一)
    ansible安装过程遇到的问题
    shell在linux里摇摇晃晃
    ubuntu18.10安装网易云音乐
    MVC Bundle生成的css路径问题
    Vuejs自定义select2指令
    VueJs笔记
    在webAPI的BaseController上使用RoutePrefix
  • 原文地址:https://www.cnblogs.com/zx-admin/p/10432095.html
Copyright © 2011-2022 走看看