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.结果

  • 相关阅读:
    Ajax随笔
    hdu 1395 2^x mod n = 1 暴力过~~最好学下欧拉定理~~~
    云计算设计模式(二)——断路器模式
    STL algorithm算法minmax,minmax_element(36)
    格式化时间
    django 带參数的 url
    Linux下 目录 压缩 解压缩 打包
    事实上就是为了玩
    Datazen配置
    HotSpot关联规则算法(2)-- 挖掘连续型和离散型数据
  • 原文地址:https://www.cnblogs.com/MySweetheart/p/13212702.html
Copyright © 2011-2022 走看看