JavaScript 的資料結構和演算法 - 連結串列程式碼篇

MasterShu發表於2020-01-05

這篇文章主要是針對上一篇文章的程式碼實踐,更多相關介紹請 移步

構建

整個連結串列是基於 JavaScript 的類來實現的

  constructor() {
    /**
     * @type {LinkedListNode}
     */
    this.head = null
    /**
     * @type {LinkedListNode}
     */
    this.tail = null
    /**
     * The size of Linked list
     * @type {number}
     */
    this.count = 0
  }

根據陣列來構建連結串列

  /**
   * Building Linked list by array.
   * @param {array} array
   */
  build(array) {
    this.count = array.length
    for (let i = 0; i < array.length; i++) {
      const newNode = new LinkedListNode(array[i])
      this.__insertToEnd(newNode)
    }
  }

主要的方法實現

大的來說,這兒主要就實現兩個方法,插入和刪除。

  /**
   * Append element to the end of the linked list
   * @param value
   * @returns {LinkedList}
   */
  append(value) {
    const newNode = new LinkedListNode(value)
    this.__insertToEnd(newNode)
    this.count++
    return this
  }

刪除這兒會稍微麻煩一點兒,需要逐個去查詢(預設會出現重複項)

  /**
   * Delete element when it equal the pass value.
   * @param value
   * @returns {null}
   */
  delete(value) {
    if (!this.head) {
      return null
    }

    let deleteNode = null

    // Delete element when position is head.
    while (this.head && this.head.value === value) {
      deleteNode = this.head
      this.head = this.head.next
      this.count--
    }

    let currentNode = this.head
    // Delete element when item's position is between head and tail.
    if (currentNode !== null) {
      while (currentNode.next) {
        if (value === currentNode.next.value) {
          deleteNode = currentNode.next
          currentNode.next = currentNode.next.next
          this.count--
        } else {
          currentNode = currentNode.next
        }
      }
    }

    // Delete element when item's position is tail.
    if (value === this.tail.value) {
      this.tail = currentNode
      this.count--
    }

    return deleteNode
  }

結束語

另外,有個 __insertToEnd 作為內部方法,感興趣的可以去看看原始碼。還有就是本系列文章是利用 AVA 做為測試框架的,如果有人感興趣的話,後續會另外開一篇文章詳細介紹。

原始碼詳見 https://github.com/MasterShu/JavaScript-Da...

本作品採用《CC 協議》,轉載必須註明作者和本文連結
路漫漫其修遠兮,吾將上下而求索。

相關文章