網頁

2022/7/11

Golang linked list API簡介

Go標準函式庫的container/list鏈結串列API用法如下。


container/list實作了雙鏈結串列(doubly linked list),為有序非連續記憶體空間儲存的資料結構,每個元素(element)/節點(node)除了資料外還記錄前一個與後一個元素的指標。


下面範例說明container/list常用的API用法。

  1. list.New()建立新的鏈結串列物件list.List
  2. List.Len()返回鏈結串列的元素數目。
  3. List.PushBack(v any)把值放入新元素並插在鏈結串列的最後並返回該元素物件list.Element
  4. List.PushFront(v any)把值放入新元素並插在鏈結串列的最前並返回該元素物件。
  5. Element.Prev()返回前一個元素。
  6. Element.Next()返回後一個元素。
  7. Element.Value取得元素儲存值。
  8. List.Remove(e *Element)從串列中移除指定元素。
  9. List.InsertAfter(v any, mark *Element)將值放入新元素並插在指定元素後
  10. List.InsertBefore(v any, mark *Element)將值放入新元素並插在指定元素後
  11. List.Front()取得串列的第一個元素。

main.go

package main

import (
    "container/list"
    "fmt"
)

func main() {
    // 註解的括號為串列所含元素狀態
    l := list.New()      // 建立一個鏈結串列物件 ([])
    fmt.Println(l.Len()) // 0

    e := l.PushBack("b") // 在串列最後插入一個元素並返回該元素(節點)e ([b])
    fmt.Println(e.Value) // b

    l.PushFront("a")     // 在串列最前插入一個元素 ([a, b])
    l.PushBack("c")      // ([a, b, c])
    fmt.Println(l.Len()) // 3

    pe := e.Prev() // 取得元素e的上一個元素
    if pe != nil {
        fmt.Println(pe.Value) // a
    }
    ne := e.Next() // 取得元素e的下一個元素
    if ne != nil {
        fmt.Println(ne.Value) // c
    }

    l.Remove(e)          // 移除元素e ([a, c])
    fmt.Println(l.Len()) // 2

    l.InsertAfter("d", ne)  // 在ne元素後插入d ([a, c, d])
    l.InsertBefore("b", ne) // 在ne元素後插入b ([a, b, c, d])

    // 遍歷串列元素並印出儲存值
    for e := l.Front(); e != nil; e = e.Next() {
        fmt.Print(e.Value) // abcd
    }
}



沒有留言:

張貼留言