Go標准容器之List


簡介
Go的標准包container中包含了常用的容器類型,包括conatiner/list,container/heap,container/ring。本篇介紹conatiner/list

conatiner/list實現了一個雙向鏈表。使用起來與其他語言的動態列表非常相似,3秒鍾便可入門。

3秒鍾入門

package main

import (
"container/list"
"fmt"
)

func main() {
nums := list.New()
nums.PushBack(1)
nums.PushBack(2)
nums.PushBack(3)
for e := nums.Front(); e != nil; e = e.Next() {
fmt.Println(e.Value)
}
}

包中有什么
包里只導出了兩個類型和一個函數:

表示列表的List類型
表示列表元素的Element類型

創建List的函數
container/list––––––––––––––container/list_
// 表示雙向列表
type List struct{ ... }

// 表示列表中的元素
type Element struct{ ... }

// 創建List
func New() *List

  


下面詳細講解該包的用法。

Element
先來看看Element類型:

container/list––––––––––––––container/list_
type Element struct {
Value interface{} // 存儲在該元素中的值
}

可以看到值的類型為 interface{},因此Element可以存儲任何值。

創建List
使用New來創建List,函數原型如下:

container/list––––––––––––––container/list_
func New() *List

示例:

oll := list.New()
添加元素
List導出了六個方法用於添加元素:

container/list––––––––––––––container/list_
// 追加新元素到末尾,返回該元素指針
func (l *List) PushBack(v interface{}) *Element
// 追加另一個列表到末尾
func (l *List) PushBackList(other *List)
// 添加新元素到開頭,返回該元素指針
func (l *List) PushFront(v interface{}) *Element
// 添加另一個列表到開頭
func (l *List) PushFrontList(other *List)
// 在mark后面插入新元素,返回新元素指針
func (l *List) InsertAfter(v interface{}, mark *Element) *Element
// 在mark前插入新元素,返回新元素指針
func (l *List) InsertBefore(v interface{}, mark *Element) *Element

示例:

// 追加元素到末尾
coll.PushBack(1)
coll.PushBack("Gopher")

// 添加元素到開頭
coll.PushFront("Cynhard")
two := coll.PushFront(2)

// 插入元素到two之前
before2 := coll.InsertBefore("Before2", two)

// 插入元素到two之后
after2 := coll.InsertAfter("After2", two)

coll2 := list.New()
coll2.PushBack(3)
coll2.PushFront("Tomcat")

// 追加另外一個列表到末尾
coll.PushBackList(coll2)

// 添加另外一個列表到開頭
coll.PushFrontList(coll2)

應注意到一個列表中的元素的值的類型不必一致。

移動元素
List導出了四個方法用於移動元素:

container/list––––––––––––––container/list_
// 移動e到mark之后
func (l *List) MoveAfter(e, mark *Element)
// 移動e到mark之前
func (l *List) MoveBefore(e, mark *Element)
// 移動e到末尾
func (l *List) MoveToBack(e *Element)
// 移動e到開頭
func (l *List) MoveToFront(e *Element)

注意e和mark都必須是l的內的元素,否則該函數不執行任何動作。

示例:

two := coll.PushFront(2)
before2 := coll.InsertBefore("Before2", two)
after2 := coll.InsertAfter("After2", two)

// 將before2移動到two的后面
coll.MoveAfter(before2, two)
// 將after2移動到two的前面
coll.MoveBefore(after2, two)
// 將before2移動到開頭
coll.MoveToFront(before2)
// 將after2移動到末尾
coll.MoveToBack(after2)

訪問元素

List導出了Back()和Front()返回結尾和開頭元素:

container/list––––––––––––––container/list_
// 返回結尾元素
func (l *List) Back() *Element
// 返回開頭元素
func (l *List) Front() *Element

示例:

fmt.Println(coll.Front().Value) // 打印開頭元素的值
fmt.Println(coll.Back().Value) // 打印結尾元素的值

 

遍歷列表
Element導出了兩個方法Prev()和Next()用以訪問前一個或后一個元素:

container/list––––––––––––––container/list_
// 返回下一個元素,如果沒有下一個元素,返回nil
func (e *Element) Next() *Element
// 返回前一個元素,如果沒有前一個元素,返回nil
func (e *Element) Prev() *Element

示例:

// 順序遍歷
for e := coll.Front(); e != nil; e = e.Next() {
fmt.Print(e.Value, " ")
}
fmt.Println()
// 逆序遍歷
for e := coll.Back(); e != nil; e = e.Prev() {
fmt.Print(e.Value, " ")
}
fmt.Println()

獲取列表長度

container/list––––––––––––––container/list_
func (l *List) Len() int

示例:

mt.Println(coll.Len())
移除元素
container/list––––––––––––––container/list_
// 移除e,返回e的值
func (l *List) Remove(e *Element) interface{}
// 清空列表
func (l *List) Init() *List

示例:

coll := list.New()
two := coll.PushFront(2)
coll.Remove(two) // 移除two
coll.Init() // 清空列表

完整示例

package main

import (
"container/list"
"fmt"
)

func printList(coll *list.List) {
for e := coll.Front(); e != nil; e = e.Next() {
fmt.Print(e.Value, " ")
}
fmt.Println()
}

func printListR(coll *list.List) {
for e := coll.Back(); e != nil; e = e.Prev() {
fmt.Print(e.Value, " ")
}
fmt.Println()
}

func main() {
coll := list.New()

coll.PushBack(1)
coll.PushBack("Gopher")

coll.PushFront("Cynhard")
two := coll.PushFront(2)

before2 := coll.InsertBefore("Before2", two)
after2 := coll.InsertAfter("After2", two)

coll.MoveAfter(before2, two)
coll.MoveBefore(after2, two)
coll.MoveToFront(before2)
coll.MoveToBack(after2)

coll2 := list.New()
coll2.PushBack(3)
coll2.PushFront("Tomcat")

coll.PushBackList(coll2)
coll.PushFrontList(coll2)

printList(coll)
printListR(coll)

fmt.Println(coll.Front().Value)
fmt.Println(coll.Back().Value)

fmt.Println(coll.Len())

coll.Remove(two)

printList(coll)

coll.Init()
printList(coll)
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM