Javascript數據結構與算法學習(三)—— 鏈表

什麼是鏈表

  • 看似火車~
  • 特點:鏈表裏的每一項除了包含自己的信息外,還包含有下一項(next)的數據內容。
  • 鏈表存儲有序的元素集合,但不同於數組,鏈表中的元素在內存中並不是連續放置的每個元素有一個存儲元素本身的節點和一個指向下一個元素的引用組成。
  • 數據結構: {element:'元素內容', next:null} ,next指向下一項(實現需要藉助一個輔助類)
    單向鏈表

鏈表的操作

以下以單向鏈表爲例:
特點:

每個節點(node)都由數據本身和一個指向後續節點的指針組成
整個鏈表的存取必須從頭指針開始,頭指針指向第一個節點
最後一個節點的指針指向空(NULL)

  • 操作
  • 獲取元素索引:indexOf
  • 尾部添加元素:append
  • 插入元素:insert(position,element)
  • 從鏈表中移除一項:remove(element)
  • 從鏈表中特定位置移除一項:removeAt(positon)
  • 是否爲空:isEmpty
    在這裏插入圖片描述
var LinkedList = function(){
    // 鏈表頭
    var head = null
    // 鏈表長度 
    var length = 0
    // 輔助類
    var Node = function(elem){
        this.elem = elem
        this.next = null
    }
    // 添加元素
    this.append = function(el){
        var node = new Node(el)
        if(head===null){
            head = node 
        }else{
            var current= head;
            while(current.next){
                current = current.next
            }
            current.next=node
        }
        length ++;
    }
    // 插入
    this.insert = function(position,element){
        var current = head
        var node = new Node(element)
        if(position===0){
            head = element
            head.next = current
        }else{
            var index = 0
            var previous= null
            while(index<position){
                previous = current
                current = current.next
                index++
            }
            previous.next = node
            node.next = current
        }
        length ++
    }
    // 刪除
    this.removeAt = function(position){
        if(position>-1&&position<length){
            // 刪除首位
            if(position===0){
                var current = head
                head = current.next
            }else{
                // 刪除其他位置
                var previous = null
                var current = head
                var index = 0
                while(index<position){
                    previous=current
                    current = current.next
                    index++
                }
                // 跳出循環時,index === position
                previous.next = current.next
            }
        }
        length --;
        return current
    }
    // 獲取元素位置
    this.indexOf = function (ele){
        var index =0 
        var current = head
        while(current){
            if(ele === current.elem){
                return index
            }
            index ++ 
            current = current.next
        }
        return -1
    }
    this.remove = function(elem){
        return this.removeAt(this.indexOf(elem))
    }
    this.isEmpty = function(){
        return length ===0 
    }
    this.size = function(){
        return length
    }
    this.printHead = function(){
        console.log(head) 
    }
}

var l = new LinkedList()
l.append(1)
l.append(2)
l.append(3)
l.insert(1,6)
l.printHead()

加強鏈表

雙向鏈表

  • 特點:含有previous指向上一項,next指向下一項,
    在這裏插入圖片描述

循環鏈表

  • 特點:鏈表尾部指向鏈表頭
    在這裏插入圖片描述
  • 應用場景:輪播圖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章