數據結構(3) JS實現單鏈表

鏈表有單鏈表和雙鏈表,概念可百度,這裏主要是以js的形式實現。

以下是我大概實現的思路

我們先定義一個類,說明一下這個鏈表的數據結構

所以我們需要定義節點,節點裏面有value(我們存儲的值)以及next(指向下個一節點)

function node(value){
    this.value = value;
    this.next = null;       //在沒有下一個節點的時候,next總是指向null
}

那現在我們什麼不要想那麼複雜,一步一步思考,把需要的東西寫出來

第一步:要添加節點

  1. 判斷是否爲頭結點      所以需要一個head變量來標識頭結點,當然初始化爲空;
  2. 要跟蹤鏈表的長度      所以需要變量length來標識長度

所以先寫添加節點的方法:  append(),我們把用到的所有方法寫到   singleList()類裏面, 作爲成員方法

function singleList(){
    
    let head = null;            //這定義頭結點,並且初始化爲null       
    let Length = 0;             //這定義頭鏈表的長度,方便查看當前的長度  

    this.append = function(value){     //定義增加節點的方法
        let currentNode;               //定義當前節點
        let node = new Node(value);    //實例出一新的節點  
        if(head ===null){
            head = node;
            Length++;
        }else{                         
            currentNode = head;
            while(currentNode.next){
                currentNode = currentNode.next;
            }
            currentNode.next = node;
            Length++;
        }
        return 'ok';
    }
}

第二步:獲取節點的長度

  1. 直接返回Length就可以
function singleList(){
    
  
    this.getLength = function(){  //直接返回Length
        return Length;
    }
    
}

 第三步:展示已經添加的節點(數組形式展示)

this.showNode = function(){
        let arr = [];               //定義數組來放鏈表的節點值
        let currentNode = head;
        while(currentNode.next!=null){
            arr.push(currentNode.value);
            currentNode = currentNode.next;
        }
        arr.push(currentNode.value);
        arr.push(1)
        return arr;
    }

 第四步:刪除節點

  1. 刪除的是第幾個節點,這裏就要指定一個下標index ,(和數組的下標一樣從0開始算起的)
  2. 根據提供的index,找到節點,然後根據下圖示例

代碼實現如下:

this.delete = function(index){
        let currentNode;
        currentNode = head;
        if(index>-1 && index <Length){            //判斷index合法不
            if(index == 0){
                head = currentNode.next;
                
            }
            else{
                let current = 0;
                while(current<index-1){
                    currentNode = currentNode.next
                    current++;
                }
                currentNode.next = currentNode.next.next;  //直接指向下下個
            }
            Length--;                                    //記得長度要自減
            return this.showNode();


        }
        else{
            throw new Error('index超過鏈表的長度啦!!!')
        }
    }

 第五步:查找節點(根據下標index查找)

實現如下:

this.find = function(index){
        let currentNode = head;
        if(index>-1 && index <Length){
            if(index ==0){
                return head.value;
            }
            else{
                let current =0
                while(current<index){
                    currentNode = currentNode.next;
                    current++;
                }
                return {"當前節點數據爲":currentNode.value};
            }
        }
    }

完整的代碼如下: 

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

    this.append = function(value){
        let currentNode;
        let node = new Node(value);
        if(head ===null){
            head = node;
            Length++;
        }else{
            currentNode = head;
            while(currentNode.next){
                currentNode = currentNode.next;
            }
            currentNode.next = node;
            Length++;
        }
        return 'ok';
    }
    this.getLength = function(){
        return Length;
    }
    this.showNode = function(){
        let arr = [];
        let currentNode = head;
        while(currentNode.next!=null){
            arr.push(currentNode.value);
            currentNode = currentNode.next;
        }
        arr.push(currentNode.value);
        arr.push(1)
        return arr;
    }
    this.delete = function(index){
        let currentNode;
        currentNode = head;
        if(index>-1 && index <Length){
            if(index == 0){
                head = currentNode.next;
                
            }
            else{
                let current = 0;
                while(current<index-1){
                    currentNode = currentNode.next
                    current++;
                }
                currentNode.next = currentNode.next.next;
            }
            Length--;
            return this.showNode();


        }
        else{
            throw new Error('index超過鏈表的長度啦!!!')
        }
    }
    this.find = function(index){
        let currentNode = head;
        if(index>-1 && index <Length){
            if(index ==0){
                return head.value;
            }
            else{
                let current =0
                while(current<index){
                    currentNode = currentNode.next;
                    current++;
                }
                return {"當前節點數據爲":currentNode.value};
            }
        }
    }
}

 

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