數據結構(4) JS實現雙向鏈表

關於思想,上一篇大概有講到,寫法也類似

上一篇:數據結構(3) JS實現單鏈表

function doubleList(){
    let head = null;
    let tail = null
    let Length = 0;
    function Node(value){
        this.value = value;
        this.prev = null;
        this.next = null;
    }
    

    this.append = function(value){
        let node = new Node(value);
        if(!head){
            head = node;
            tail = node;
        }
        else{
            let currentNode = head;
            while(currentNode.next){
                currentNode = currentNode.next;
            }
            node.prev = currentNode
            currentNode.next = node;
            tail = node;
        }
        Length++;
        return 'ok';
    }
    this.getLength = function(){
        return Length;
    }
    this.showNode = function(){
        let currentNode  = head;
        let arr = [];
        while(currentNode.next){
            arr.push(currentNode.value);
            currentNode = currentNode.next;
        }
        arr.push(currentNode.value);
        return arr;
    }
    this.find = function(index){
        
        if(index>-1 && index<Length){
            let currentNode  = head;
            if(index ==0){
                return {
                    '當前節點:':head.value,
                    '後驅節點:':head.next?head.next.value:undefined
                };
            }else{
                let current = 0;
                while(current<index){
                    current++;
                    currentNode = currentNode.next
                }
                return {
                    "前驅節點":currentNode.prev.value,
                    "當前節點":currentNode.value,
                    "後驅節點":currentNode.next?currentNode.next.value:undefined
                }
            }  
        }
        else{
            throw new Error('下標越界了!')
        }
    }
    this.delete = function(index){
        if(index>-1 && index<Length){          //判斷index是否越界
            
            let a = Length/2;                  //主要是用來判斷index是在那個區域,如果在前半部分,從前往後遍歷快一點,如果是在後半部分,從後面往前面遍歷更好,速度快
            let currentNode;
            let current;
            if(index<=a){                      //前半部分
                if(index ==0){
                    head = head.next;
                    head.prev = null;
                }else{
                    current=0;
                    currentNode = head;
                    while(current < index){
                        current++;
                        currentNode = currentNode.next
                    }
                    currentNode.next = currentNode.next.next;
                    currentNode.next.next.prev = currentNode;
                }   
            }else if(index>=a){                    //後半部分
                if(index ==Length-1){
                    tail.prev.next =null;
                    tail = tail.prev;
                }
                else{
                    current = Length-1;
                    currentNode = tail;
                    while(current>index){
                        current--;
                        currentNode = currentNode.prev;
                    }
                    let preview =currentNode.prev;
                    let nextNode = currentNode.next;
                    preview.next = nextNode;
                    nextNode.prev = preview;
                }
            }
            Length--;
            return this.showNode();
        }
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章