列表是一種非連續的存儲容器,由多個節點組成,節點通過一些變量記錄彼此之間的關系,列表有多種實現方法,如單鏈表、雙鏈表等。
## 初始化列表
list的初始化有兩種方法:兩種方法的初始化效果都是一致的。
* 使用New()函數:通過container/list包中的New()函數初始化list
變量名 := list.New()
* var關鍵字聲明
var 變量名 list.List
列表與切片和map不同的是,列表沒有具體元素類型的限制,因此,列表的元素可以是任意類型,這既帶來了便利,也引來了一些問題,例如給列表中放入一個interface{}類型的值,取出值后,若要將interface{}轉換為其他類型將會發生宕機。
## 在列表中插入元素
雙鏈表支持從隊列前方或后方插入元素,分別對應的方法是PushFront和PushBack。
提示:
這兩個方法都會返回一個*list.Element結構,若在以后的使用中需要刪除插入的元素,則只能通過*list.Element配置Remove()方法進行刪除,這種方法可以讓刪除更加效率化。同時也是雙鏈表特性之一。
| 方法 | 功能 |
| --- | --- |
| PushFront(v interface{}) *Element | 在鏈表的前方插入元素 |
| PushBack(v interface{}) *Element | 在鏈表的后方插入元素 |
| InsertBefore(v interface{}, mark *Element) *Element | 在mark點之前插入元素,mark點由其他插入函數提供 |
| InsertAfter(v interface{}, mark *Element) *Element | 在mark點之后插入元素,mark點由其他插入函數提供 |
| PushFrontList(other *list) | 添加other列表元素到頭部 |
| PushBackList(other *list) | 添加other列表元素到尾部 |
## 列表中刪除元素
列表插入函數的返回值會提供一個*list.Element結構,這個結構記錄著列表元素的值以及其他節點之間的關系等信息,從列表中刪除元素時,需要用到這個結構進行快速刪除。
```
package main
import "container/list"
func main() {
l := list.New()
// 尾部添加
l.PushBack("canon")
// 頭部添加
l.PushFront(67)
// 尾部添加之后保存元素句柄
element := l.PushBack("first")
// 在first之后添加high
l.InsertAfter("high", element)
// 在first之前添加noon
l.InsertBefore("noon", element)
// 刪除
l.Remove(element)
}
```
## 遍歷列表,訪問列表的每一個元素
遍歷雙鏈表需要配置Front()函數獲取頭元素,遍歷時只要元素不為空就可以繼續進行,每次遍歷都會調用元素的Next()函數,代碼如下:
```
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New()
// 尾部添加
l.PushBack("canon")
// 頭部添加
l.PushFront(67)
for item := l.Front(); item != nill; item = item.Next() {
fmt.Println(item.Value)
}
}
```
- 1.Go語言前景
- 2.Go語言環境搭建
- 3.Go語言的基本語法
- 3.1變量
- 3.1.1變量聲明
- 3.1.2變量初始化
- 3.1.3多個變量同時賦值
- 3.1.4匿名變量
- 3.1.5變量的作用域
- 3.1.6整型
- 3.1.7浮點類型
- 3.1.8復數
- 3.1.9bool類型
- 3.1.10字符串
- 3.1.11字符類型
- 3.1.12類型轉換
- 3.2常量
- 3.1.1const關鍵字
- 3.2.2模擬枚舉
- 4.Go語言的流程控制
- 4.2循環結構
- 4.3鍵值循環
- 4.4switch語句
- 4.5goto語句
- 4.6break語句
- 4.7continue語句
- 5.Go語言的函數
- 5.1函數聲明
- 5.2函數變量
- 5.3函數類型實現接口
- 5.4閉包
- 5.5可變參數
- 5.6defer(延遲執行語句)
- 5.7處理運行時錯誤
- 5.8宕機(panic)
- 5.9宕機恢復(recover)
- 5.10Test功能測試函數
- 6.Go語言的內置容器
- 6.1數組
- 6.2切片
- 6.3map
- 6.4sync.Map
- 6.5list
- 6.6range
- 7.Go語言的結構體
- 8.Go語言的接口
- 9.Go語言的常用內置包
- 10.Go語言的并發
- 11.Go語言的文件I/O操作
- 12.Go語言的網絡編程
- 13.Go語言的反射
- 14.Go語言的數據庫編程
- 15.Go語言密碼學算法
- 16.Go語言的gin框架
- 17.Go語言的網絡爬蟲
- 18.Go語言的編譯和工具鏈