js 單項鍊表

kboypkb發表於2021-09-09

介紹連結串列

連結串列是由一組節點組成的集合。每一個節點都使用一個物件的引用指向它的後續借點。指向另外一個借點的引用叫做鏈。
很多程式語言中陣列的長度是固定的,就是定義陣列的時候需要定義陣列的長度,所以當陣列已經被資料填滿的時候,需要再加入新的元素就很困難。只能說在部分變成語言中會有這種情況,在javascript中和php中陣列的長度是可以任意增加的。在陣列中新增和刪除元素也是比較麻煩,因為要將陣列中其他元素向前或者向後平移,這個在javascript中也不是問題,javascript中有一個很方便的方法splice()方法很方便的就可以新增或刪除元素。
但是凡是都是相對的,javascript中的陣列也有自己的問題,他們被設計成了物件,與其他語言(比如c++和java)相比它的效率很低。
如果在實際的使用中發現陣列的效率很慢,就可以考慮使用連結串列來代替。陣列還有個優勢是可以根據鍵值很方便的訪問陣列的值,除此之外,連結串列在任何場合都可以代替陣列。如果需要隨機地訪問元素,陣列仍然是更好的選擇。

程式碼實現

定義連結串列節點(Node)類
Node類包含兩個屬性,element用來儲存節點上的資料,next用來儲存指向下一個節點的連結

class Node {    constructor(element) {        this.element = element;  // 表示節點上的資料
        this.next = null;   // 表示指向下一個節點的連結
    }
}export default Node;

定義連結串列類(LinkedList)類
LinkedList類提供插入節點,刪除節點,顯示連結串列節點元素的方法,以及一些其他的輔助方法

import Node from './Node';/**
 * Linked List class
 */class LinkedList {    /**
     * 構造器,初始化頭節點
     */
    constructor() {        this.head = new Node('head');  // 節點頭列表
    }    /**
     * 根據指定值找出當前節點
     * 輔助方法
     * @param {*} item 
     */
    _find(item) {        let currNode = this.head;        while(currNode.element != item) {
            currNode = currNode.next;
        }        return currNode;    
    }    /**
     * 把新的節點插入到指定節點的後面
     * @param {*} newELement 插入的新節點
     * @param {*} item 插入元素的前一個節點值
     */
    insert(newELement, item) {        let newNode = new Node(newELement);        let currNode = this._find(item);
        newNode.next = currNode.next;
        currNode.next = newNode;
    }    /**
     * 移除節點
     * @param {*} item 
     */
    remove(item) {   
        // 找出指定節點的前一個節點
        let prevNode = this.head;        while(prevNode.next != null && prevNode.next.element != item) {
            prevNode = prevNode.next;
        }        if (prevNode.next != null) {            // 設定前一個節點next指向當前節點的next
            prevNode.next = prevNode.next.next;
        }
    }    /**
     * 顯示所有節點資料
     */
    display() {        let currNode = this.head;        while(currNode.next != null) {            console.log(currNode.next.element);
            currNode = currNode.next;
        }
    }
}export default LinkedList;

測試

import LinkedList from './LinkedList';// 建立一個 LinkedList 例項let ll = new LinkedList();// 插入一些元素ll.insert('zhangsan', 'head');
ll.insert('lisi', 'zhangsan');
ll.insert('wangwu', 'lisi');

ll.display();  // 顯示元素,控制檯輸出 zhangsan,lisi,wangwull.remove('lisi');
ll.display(); // 控制檯輸出 zhangsan,wangwu

原文出處:https://www.cnblogs.com/qiaojie/p/9575790.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1916/viewspace-2813435/,如需轉載,請註明出處,否則將追究法律責任。

相關文章