列表有很多种实现方法,比如单链表、双链表等

golang中 列表container/list    内部的实现原理是双链表

创建方式:

listName := list.New()

var listName = list.List

插入普通元素

PushFront  PushBack  InsertBefore  InsertAfter

    var l1 list.List  // l1 := list.New() 一样的效果
	a := l1.PushBack("111")
	b := l1.InsertBefore(100,a)
	l1.InsertAfter("2222",b)
    l1.PushFront(200)
	for i:=l1.Front();i != nil;i = i.Next() {
		fmt.Println("l1 Element =", i.Value)
	}
/**
l1 Element = 200
l1 Element = 100
l1 Element = 2222
l1 Element = 111
**/

列表除了支持插入元素外,还支持插入列表。。。

在尾部插入列表语法:PushBackList(other *List)

    l2 := list.New()
	l2.PushFront("3333")
	l2.PushBack("444444")
	l1.PushBackList(l2)
    for i:=l1.Front();i != nil;i = i.Next() {
		fmt.Println("Element =", i.Value)
	}

/*
Element = 200
Element = 100
Element = 2222
Element = 111
Element = 3333
Element = 444444

*/

 在头部插入列表语法:PushFrontList(other *List)

    l3 := list.New()
	l3.PushBack("a3")
	l3.PushFront("a31")
	l3.PushFrontList(l2)
	for i:=l3.Front();i != nil;i = i.Next() {
		fmt.Println("Element =", i.Value)
	}
/*
Element = 3333
Element = 444444
Element = a31
Element = a3

*/

列表删除元素

    l4 := list.New()
	a = l4.PushBack("a")
	b = l4.PushFront("b")
	value := l4.Remove(a)
	fmt.Println(value)
	for i:=l4.Front();i != nil;i = i.Next() {
		fmt.Println("Element =", i.Value)
	}
/*
a
Element = b
*/

list.Remove(nil)   删除空是有问题的!!!!!!!

列表遍历

    for i := l1.Front();i!=nil;i = i.Next(){
		fmt.Println("front--->back:",i.Value)
	}
	fmt.Println("###########################")
	for i := l1.Back();i!= nil;i = i.Prev(){
		fmt.Println("back--->front:",i.Value)
	}

/*
   front--->back: 200
front--->back: 100
front--->back: 2222
front--->back: 111
front--->back: 3333
front--->back: 444444
###########################
back--->front: 444444
back--->front: 3333
back--->front: 111
back--->front: 2222
back--->front: 100
back--->front: 200

*/

列表元素移动

移到元素前

MoveBefore(e, mark *Element)  把e移动到makr 之前。。

如果将指定元素移动到另一元素的前面中的指定元素本来就在另一元素的前面,那么列表不会做任何的改动,或者如果指定元素不是列表中的元素,列表也不会做任何改动。

    l5 := list.New()
	a = l5.PushBack("a")
	b = l5.PushBack("b")
	l5.MoveBefore(b,a)
	for i := l5.Front();i!= nil;i = i.Next(){
		fmt.Println("l1:",i.Value)
	}
/*
b
a
*/

移到元素后  MoveAfter(e, mark *Element)

移到列表最前  MoveToFront(e *Element)

移到列表最后 MoveToBack(e *Element)

获取节点

Front() *Element

Back () *Element

Prev() *Element

Next() *Element

获取长度

Len() int