標籤:語言 刪除元素 測試 輸出 this asc default 插入 isp
介紹鏈表
鏈表是由一組節點群組成的集合。每一個節點都使用一個對象的引用指向它的後續借點。指向另外一個借點的引用叫做鏈。
很多程式設計語言中數組的長度是固定的,就是定義數組的時候需要定義數組的長度,所以當數組已經被資料填滿的時候,需要再加入新的元素就很困難。只能說在部分變成語言中會有這種情況,在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
js 單項鏈表