zoukankan      html  css  js  c++  java
  • 使用javaScript实现一个双端链表

    这个双端链表继承了单链表的一些属性,详情请见:https://www.cnblogs.com/MySweetheart/p/13212220.html

    1.创建一个双端节点

    class DoublyNode extends Node{
        constructor(element,next,prev){
            super(element,next);
            this.prev = prev;
        }
    }

    2.创建一个双端链表类

    class DoublyLinkedList extends LinkedList{
        constructor(equalsFn = defaultEquals){
            super(equalsFn);
            this.tail = undefined;
        }
    }

    3.由于继承了单链表的一些方法,所以这里就重写了一些方法

    3.1添加元素

        push(element){
            let node = new DoublyNode(element);
            if(this.head == undefined){
                this.head = node;
                this.tail = node;
            }else{
                this.tail.next = node;
                node.prev = this.tail;
                this.tail = node;
            }
            this.count++;
        }

    3.2指定位置添加元素

     insert(element,position){
            if(position >= 0 && position <= this.count){
                let node = new DoublyNode(element);
                if(position === 0){
                    if(this.count == 0){
                        this.head = node;
                        this.tail = node;
                    }else{
                        let current =this.head;
                        node.next = current;
                        current.prev = node;
                        this.head = node;
                    }
                }else if(position === this.count){
                    this.tail.next = node;
                    node.prev = this.tail;
                    this.tail = node;
                }else{
                    let current = this.getElementAt(position);
                    node.next = current;
                    current.prev.next = node;
                    node.prev = current.prev;
                    current.prev = node;
                }
                this.count++;
            }
            return 'position is null';
        }

    3.3删除指定位置的元素

        removeAt(index){
            if(this.isEmpty()) return 'linkedlist is null';
            if(index >= 0 && index < this.count){
                if(index === 0){
                    if(this.count === 1){
                        this.head = undefined;
                        this.tail = undefined;
                    }else{
                       let current = this.head.next;
                       this.head = current;
                    }
                }else if(index === this.count-1){
                    this.tail = this.tail.prev;
                }else{
                    let current = this.getElementAt(index);
                    current.prev.next = current.next;
                    current.next.prev = current.prev;
                }
                this.count--;
            }
            return 'index out of range';
        }

    4.完整代码

    class DoublyNode extends Node{
        constructor(element,next,prev){
            super(element,next);
            this.prev = prev;
        }
    }
    class DoublyLinkedList extends LinkedList{
        constructor(equalsFn = defaultEquals){
            super(equalsFn);
            this.tail = undefined;
        }
        push(element){
            let node = new DoublyNode(element);
            if(this.head == undefined){
                this.head = node;
                this.tail = node;
            }else{
                this.tail.next = node;
                node.prev = this.tail;
                this.tail = node;
            }
            this.count++;
        }
        insert(element,position){
            if(position >= 0 && position <= this.count){
                let node = new DoublyNode(element);
                if(position === 0){
                    if(this.count == 0){
                        this.head = node;
                        this.tail = node;
                    }else{
                        let current =this.head;
                        node.next = current;
                        current.prev = node;
                        this.head = node;
                    }
                }else if(position === this.count){
                    this.tail.next = node;
                    node.prev = this.tail;
                    this.tail = node;
                }else{
                    let current = this.getElementAt(position);
                    node.next = current;
                    current.prev.next = node;
                    node.prev = current.prev;
                    current.prev = node;
                }
                this.count++;
            }
            return 'position is null';
        }
        removeAt(index){
            if(this.isEmpty()) return 'linkedlist is null';
            if(index >= 0 && index < this.count){
                if(index === 0){
                    if(this.count === 1){
                        this.head = undefined;
                        this.tail = undefined;
                    }else{
                       let current = this.head.next;
                       this.head = current;
                    }
                }else if(index === this.count-1){
                    this.tail = this.tail.prev;
                }else{
                    let current = this.getElementAt(index);
                    current.prev.next = current.next;
                    current.next.prev = current.prev;
                }
                this.count--;
            }
            return 'index out of range';
        }
    }

    5.结果

  • 相关阅读:
    php数组函数array_slice、array_splice
    php使用curl_init()和curl_multi_init()多线程的速度比较详解
    mysql忘记root密码
    php的RSA非对称加密
    phpstudy开启xdebug
    Centos7系统yum安装软件 No more mirrors to try
    python数据分析与数据可视化入门级
    第一周博客总结
    python——pandas初体验
    第十六周博客总结
  • 原文地址:https://www.cnblogs.com/MySweetheart/p/13212702.html
Copyright © 2011-2022 走看看