• 双向链表实现查询、删除、插入、末尾增加


    双向链表可以从前往后查询或者从后往前查询,提高了查询效率。需要存储两个方向的指针,占用了更大的空间。

    let DoubleNode = function(element){
        this.element = element;
        this.next = null;
        this.prior = null;
    }
    class DobuleLinkedList {
        constructor() {
            this.length = 0;
            this.head = null; 
            this.tail = null;
        }
        // 获取某位置的结点
        getElementAt(position) {
            if(position < 0 || position >= this.length){
                return;
            }
            let current;
            if(position <= this.length/2){
                current = this.head;
                for(let i = 0; i < position; i++){
                    current = current.next;  
                }
            }else{
                current = this.tail;
                for(let i = this.length - 1; i > position; i++){
                    current = current.prior;
                }
            }
    
    
            return current;
        }
        append(element) {
            let node = new DoubleNode(element);
            if(this.head === null){
                this.head = node; 
            }else{
                let origin = this.getElementAt(this.length - 1);
                origin.next = node;
                node.prior = origin;
            }
            this.tail = node;
            this.length++;
        }
        // 在某位置插入1个结点
        insert(position, element) { 
            let node = new DoubleNode(element);
            if(position < 0 || position > this.length){
                return;
            }else{
                if(this.head === null){
                    this.head = node;
                    this.tail = node;
                }else{
                    // 插在头结点
                    if(position === 0){ 
                        node.next = this.head;
                        this.head.prior = node;
                        this.head = node;
                    }else{
                        let origin = this.getElementAt(position - 1);
                        node.prior = origin;
                        if(origin.next){
                            // 插在中间
                            node.next = origin.next; 
                            origin.next.prior = node;
                            origin.next = node;
                        }else{
                            // 插在最后一位 
                            node.next = null;
                            origin.next = node;  
                            this.tail = node;
                        }
                        
                    }
    
                }
                this.length++;
            } 
        }
        // 在某位置删除1个结点
        delete(position) {
            if(position < 0 || position > this.length){
                return;
            }else{
                if(position === 0){  
                    this.head = this.head.next;
                    this.head.prior = null;
                }else{ 
                    let current = this.getElementAt(position);
                    // 删除中间位
                    if(current.next){ 
                        current.prior.next = current.next;
                        current.next.prior = current.prior;
                    }else{
                        // 删除最后一位  
                        current.prior.next = null; 
                        this.tail = current.prior;
                    } 
                } 
                this.length--;
            }
    
        }
    }
  • 相关阅读:
    压缩感知(CS)
    在linux服务器上配置anaconda和Tensorflow,并运行
    opencv基本操作
    在windows10下vs2017配置opencv4.0.0
    枚举
    图片居中
    css初始化
    常用颜色
    css三大布局
    盒子宽度
  • 原文地址:https://www.cnblogs.com/Isabel-1996/p/13898873.html
Copyright © 2020-2023  润新知