List列表是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系。 列表有多种实现方法,如单链表、双链表等。
1、初始化列表
1.1 使用New方法初始化list
使用:变量名:=list.New()
1.2 通过声明初始化list
使用: var 变量名 list.List
列表与切片和map不同的是,列表并没有具体元素类型的限制。因此,列表的元素可以是任意类型。这既带来便利,也会引来一些问题。
给一个列表放入了非期望类型的值,在取出值后,将interface{}转换为期望类型时将会发生宕机。
2、 在列表中插入元素
双链表支持从队列前方或后方插入元素,分别对应的方法是Push Front
和Push Back
。 Push Back
:将元素插入到列表后方。 Push Front
:将元素插入到列表前方。
node := list.New()
node.PushBack("fist")
node.PushFront(67)
3、 List的遍历
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New()
l.PushBack("last")
l.PushFront("two")
l.PushFront("one")
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
}
4、获取首部、尾部、前一个、后一个节点。
Golang的列表元素的获取可以使用内置的 Front 函数获取头结点,使用 Back 函数获取尾结点,使用 Prev 获取前一个结点,使用 Next 获取下一个结点。
4.1 获取列表头结点
Front() *Element
使用列表内置的 Front() 函数,获取列表的头结点。
package main
import (
"container/list"
"fmt"
)
func main() {
//使用列表内置的 Front() 函数,获取列表的头结点
MyList := list.New()
MyList.PushBack("ccc")
MyList.PushBack("ggg")
MyList.PushBack("mmm")
element := MyList.Front()
fmt.Println(element.Value)
}
4.2 获取列表尾结点
Back () *Element
使用列表内置的 Back() 函数,获取列表的尾结点。
package main
import (
"container/list"
"fmt"
)
func main() {
//使用列表内置的 Front() 函数,获取列表的尾结点
MyList := list.New()
MyList.PushBack("ccc")
MyList.PushBack("ggg")
MyList.PushBack("mmm")
element := MyList.Back()
fmt.Println(element.Value)
}
4.3 获取上一个结点
Prev() *Element
使用列表内置的 Prev() 函数,获取列表的上一个结点。
package main
import (
"container/list"
"fmt"
)
func main() {
//使用列表内置的 Prev() 函数,获取列表的上一个节点
MyList := list.New()
MyList.PushBack("ccc")
MyList.PushBack("ggg")
MyList.PushBack("mmm")
element := MyList.Back()
fmt.Println(element.Value)
elementPre := element.Prev()
fmt.Println(elementPre.Value)
}
4.4 获取下一个结点
Next() *Element
使用列表内置的 Next() 函数,获取列表的下一个结点。
package main
import (
"container/list"
"fmt"
)
func main() {
//使用列表内置的 Next() 函数,获取列表的下一个节点
MyList := list.New()
MyList.PushBack("ccc")
MyList.PushBack("ggg")
MyList.PushBack("mmm")
element := MyList.Back()
fmt.Println(element.Value)
elementPre := element.Prev()
fmt.Println(elementPre.Value)
MyList.PushBack("real last")
elementNext := element.Next()
fmt.Println(elementNext.Value)
}
5、其他操作
package main
import (
"container/list"
"fmt"
)
func main() {
// 其它常见操作
l := list.New()
l.PushBack("aaa")
l.PushFront("111")
aaaElement := l.Back()
l.InsertAfter("我在aaa之后", aaaElement)
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
fmt.Println()
temp := l.Back()
l.InsertBefore("我在 \" 我在aaa之后\" 的前面 ", temp)
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
fmt.Println()
hasRemoved := l.Remove(l.Back())
fmt.Println("当前被删除的是:", hasRemoved)
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
}
6、list提供的方法:
type Element
func (e *Element) Next() *Element
func (e *Element) Prev() *Element
type List
func New() *List
func (l *List) Back() *Element // 返回最后一个元素
func (l *List) Front() *Element // 返回第一个元素
func (l *List) Init() *List // 链表初始化
func (l *List) InsertAfter(v interface{}, mark *Element) *Element // 在某个元素前插入
func (l *List) InsertBefore(v interface{}, mark *Element) *Element // 在某个元素后插入
func (l *List) Len() int // 返回链表长度
func (l *List) MoveAfter(e, mark *Element) // 把e元素移动到mark之后
func (l *List) MoveBefore(e, mark *Element) // 把e元素移动到mark之前
func (l *List) MoveToBack(e *Element) // 把e元素移动到队列最后
func (l *List) MoveToFront(e *Element) // 把e元素移动到队列最头部
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) // 在队列头部插入接上新队列
func (l *List) Remove(e *Element) interface{} // 删除某个元素3.
7、列表除了支持插入元素外,还支持插入列表
package main
import (
"container/list"
"fmt"
)
func main() {
L := list.New()
L.PushBack("111")
L.PushBack("222")
L2 := list.New()
L2.PushBack("333")
L2.PushBack("444")
L.PushBackList(L2) // 插入L2切片
L.PushBackList(L) // 甚至可以插自己
for i := L.Front(); i != nil; i = i.Next() {
fmt.Println("Element = ", i.Value)
}
}
// output
Element = 111
Element = 222
Element = 333
Element = 444
Element = 111
Element = 222
Element = 333
Element = 444
到此。