在Go語言中,列表使用 container/list 包來實現,內部的實現原理是雙鏈表,列表能夠高效地進行任意位置的元素插入和刪除操作。
初始化列表
list 的初始化有兩種方法:分別是使用 New() 函數和 var 關鍵字聲明,兩種方法的初始化效果都是一致的。
1) 通過 container/list 包的 New() 函數初始化 list
變量名 := list.New()
2) 通過 var 關鍵字聲明初始化 list
var 變量名 list.List
列表與切片和 map 不同的是,列表並沒有具體元素類型的限制,因此,列表的元素可以是任意類型,這既帶來了便利,也引來一些問題,例如給列表中放入了一個 interface{} 類型的值,取出值后,如果要將 interface{} 轉換為其他類型將會發生宕機。
在列表中插入元素
雙鏈表支持從隊列前方或后方插入元素,分別對應的方法是 PushFront 和 PushBack。
提示
這兩個方法都會返回一個 *list.Element 結構,如果在以后的使用中需要刪除插入的元素,則只能通過 *list.Element 配合 Remove() 方法進行刪除,這種方法可以讓刪除更加效率化,同時也是雙鏈表特性之一。
從列表中刪除元素
列表插入函數的返回值會提供一個 *list.Element 結構,這個結構記錄着列表元素的值以及與其他節點之間的關系等信息,從列表中刪除元素時,需要用到這個結構進行快速刪除。
package main import ( "container/list" "fmt" ) func main() { //創建一個實例 lst := list.New() //尾部添加 lst.PushBack(".") //前部添加 lst.PushFront("day") //前部添加后,保存元素句柄 element := lst.PushFront("is ") //在is 之后添加 mon lst.InsertAfter("mon", element) //在is 之前添加 Today lst.InsertBefore("Today ", element) //打印 輸出 Today is monday. // i:=lst.Front() 表示初始賦值,只會在一開始執行一次,每次循環會進行一次 i != nil 語句判斷,如果返回 false,表示退出循環,反之則會執行 i = i.Next()。 for i := lst.Front(); i != nil; i = i.Next() { fmt.Print(i.Value) } //刪除 元素 lst.Remove(element) fmt.Println() //打印 輸出 Today monday. for i := lst.Front(); i != nil; i = i.Next() { fmt.Print(i.Value) } fmt.Println("\nlst2輸出") var lst2 list.List lst2.PushBack("one") lst2.PushFront("zero ") //打印 for i := lst2.Front(); i != nil; i = i.Next() { fmt.Println(i.Value) } }
打印輸出
Today is monday. Today monday. lst2輸出 zero one