List列表是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系。 列表有多种实现方法,如单链表、双链表等。

1、初始化列表

1.1 使用New方法初始化list

        使用:变量名:=list.New()

1.2 通过声明初始化list

        使用: var 变量名 list.List

        列表与切片和map不同的是,列表并没有具体元素类型的限制。因此,列表的元素可以是任意类型。这既带来便利,也会引来一些问题。

        给一个列表放入了非期望类型的值,在取出值后,将interface{}转换为期望类型时将会发生宕机。

2、 在列表中插入元素

        双链表支持从队列前方或后方插入元素,分别对应的方法是Push FrontPush BackPush 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)
	}
}

go语言实现消息队列 go语言列表_List

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

到此。