js 單項鍊表

介紹鏈表

鏈表是由一組節點組成的集合。每個節點都使用一個對象的引用指向它的後續借點。指向另一個借點的引用叫作鏈。
不少編程語言中數組的長度是固定的,就是定義數組的時候須要定義數組的長度,因此當數組已經被數據填滿的時候,須要再加入新的元素就很困難。只能說在部分變成語言中會有這種狀況,在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
相關文章
相關標籤/搜索