鏈表是由一組節點組成的集合。每個節點都使用一個對象的引用指向它的後續借點。指向另一個借點的引用叫作鏈。
不少編程語言中數組的長度是固定的,就是定義數組的時候須要定義數組的長度,因此當數組已經被數據填滿的時候,須要再加入新的元素就很困難。只能說在部分變成語言中會有這種狀況,在javascript中和php中數組的長度是能夠任意增長的。在數組中添加和刪除元素也是比較麻煩,由於要將數組中其餘元素向前或者向後平移,這個在javascript中也不是問題,javascript中有一個很方便的方法splice()方法很方便的就能夠添加或刪除元素。
可是凡是都是相對的,javascript中的數組也有本身的問題,他們被設計成了對象,與其餘語言(好比c++和java)相比它的效率很低。
若是在實際的使用中發現數組的效率很慢,就能夠考慮使用鏈表來代替。數組還有個優點是能夠根據鍵值很方便的訪問數組的值,除此以外,鏈表在任何場合均可以代替數組。若是須要隨機地訪問元素,數組仍然是更好的選擇。javascript
定義鏈表節點(Node)類
Node類包含兩個屬性,element用來保存節點上的數據,next用來保存指向下一個節點的連接php
class Node { constructor(element) { this.element = element; // 表示節點上的數據 this.next = null; // 表示指向下一個節點的連接 } } export default Node;
定義鏈表類(LinkedList)類
LinkedList類提供插入節點,刪除節點,顯示鏈表節點元素的方法,以及一些其餘的輔助方法java
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,wangwu ll.remove('lisi'); ll.display(); // 控制檯輸出 zhangsan,wangwu