鏈表在js中的實現

最近在看js數據結構與算法,可是一直搞不明白在代碼中的實現。今天結合找到的一些資料總結一下鏈表在js中的實現。
首先說下鏈表,在計算機科學中, 一個鏈表是數據元素的線性集合, 元素的線性順序不是由它們在內存中的物理位置給出的。相反,每一個元素指向下一個元素。它是由一組節點組成的數據結構,這些節點一塊兒表示序列。在最簡單的形式下,每一個節點由數據和到序列中下一個節點的引用(換句話說,連接)組成。這種結構容許在迭代期間有效地從序列中的任何位置插入或刪除元素。關於鏈表更多的說明請參考連接描述javascript

大體瞭解了鏈表的概念以後咱們就看下鏈表在js代碼中的實現:java

單向鏈表node

//這裏element存放的是該節點上的數據,next存放的是指向下一個節點的連接
function Node(element){
    this.element = element;
    this.next = null;
}
//接下來構建一個List類
function List(node){
    this.node = new Node(node);
    //查找節點
    this.find = function(target){
        var current = this.node;
        while(current.element != target){
            current = current.next;
            if(!current){
                return false;
            }
        }
        return current;
    };
    //插入節點
    this.insert = function(newNode, target){
        var newnode = new Node(newNode);
        var current = this.find(target);
        newnode.next = current.next;
        current.next = newnode;
    };
    //查找前一個節點
    this.findPre = function(item){
        var current = this.node;
        while(!current.next && current.next.element != item){
            current = current.next; 
        }
        return current;
    };
    //刪除節點
    this.delete = function(target){
        var deltarget = this.find(target); 
        this.findPre(deltarget).next = deltarget.next;
    };
}

執行查找節點操做,可見以下輸出:git

clipboard.png

執行插入節點操做,可見:github

clipboard.png

執行刪除節點操做,可見:算法

clipboard.png

雙向鏈表數據結構

在計算機科學中, 一個雙向鏈表(doubly linked list) 是由一組稱爲節點的順序連接記錄組成的連接數據結構。每一個節點包含兩個字段,稱爲連接,它們是對節點序列中上一個節點和下一個節點的引用。開始節點和結束節點的上一個連接和下一個連接分別指向某種終止節點,一般是前哨節點或null,以方便遍歷列表。若是隻有一個前哨節點,則列表經過前哨節點循環連接。它能夠被概念化爲兩個由相同數據項組成的單鏈表,但順序相反。this

function Node(element){
    this.pre = null;
    this.element = element;
    this.next = null;
}
function List(node){
    this.node = new Node(node);
    this.find = function(target){
        var current = this.node;
        while(current.element != target){
            current = current.next;
            if(current == null){
                return false;
            }
        }
        return current;
    };
    this.insert = function(newNode, target){
        var target = this.find(target);
        var newNode = new Node(newNode);
        newNode.next = target.next;
        newNode.pre = target;
        target.next = newNode;
    };
    this.delete = function(delNode){
        var delNode = this.find(delNode);
        delNode.next.pre = delNode.pre;
        delNode.pre.next = delNode.next;
    };
}
var list = new List('a');
list.insert('b', 'a');
list.insert('c', 'b');
list.delete('b');
console.log(list);
相關文章
相關標籤/搜索