list 库

简介

在 Go 语言中,将列表使用 container/list 包来实现,内部的实现原理是双链表。列表能够高效地进行任意位置的元素插入和删除操作。

func New() *List{}

初始化一个列表,返回类型为一个list对象
a := list.New() # 在函数内部
a = list.New()

输出:
&{{0xc00006a300 0xc00006a300 <nil> <nil>} 0}

func (l List) Back() Element{}

返回链表的最后一个元素,返回类型元列表中的元素。
x := a.Back()
fmt.Println(strings.Repeat("-----------", 10))
fmt.Println(x)

&{0xc00006a300 0xc00006a330 0xc00006a300 b}

func (l List) Front() Element{}

返回链表的第一个元素,返回类型元列表中的元素。
x := a.Front()
fmt.Println(strings.Repeat("-----------", 10))
fmt.Println(x)
&{0xc00006a360 0xc00006a300 0xc00006a300 a}

func (l List) Init() List{}

初始化此链表,将元素全部清空
m := a.Init()
fmt.Println(m)
输出:
&{{0xc00006a300 0xc00006a300 <nil> <nil>} 0}

func (l List) InsertAfter(v interface{}, mark Element) *Element{}

InsertAfter在mark之后立即插入一个值为v的新元素e并返回e。如果mark不是l的元素,则不修改列表。商标不得为零。
b := a.PushBack("b")
fmt.Println(a.InsertAfter("mm", b))
fmt.Println(a)

&{0xc000068300 0xc000068360 0xc000068300 mm}
&{{0xc000068300 0xc000068480 <nil> <nil>} 1}

func (l List) InsertBefore(v interface{}, mark Element) *Element{}

b := a.PushBack("b")
fmt.Println(a.InsertBefore("mm", b))
fmt.Println(a)

&{0xc000068300 0xc000068360 0xc000068300 mm}
&{{0xc000068300 0xc000068480 <nil> <nil>} 1}

func (l *List) Len() int{}

返回链表的长度,返回值类型为×××
fmt.Println(a.Len())

1

func (l List) MoveAfter(e, mark Element){}

MoveAfter将标记后的元素e移动到新位置。如果e或mark不是l或e == mark的元素,则不修改列表。元素和标记不得为零。

func (l List) MoveBefore(e, mark Element){}

MoveBefore将元素e移动到标记前的新位置。如果e或mark不是l或e == mark的元素,则不修改列表。元素和标记不得为零。

func (l List) MoveToBack(e Element){}

MoveToBack将元素e移动到列表l的后面。如果e不是l的元素,则不修改列表。元素不能为零。

func (l List) MoveToFront(e Element){}

MoveToFront将元素e移动到列表l的前面。如果e不是l的元素,则不修改列表。元素不能为零。

func (l List) PushBack(v interface{}) Element{}

PushBack在列表l的后面插入一个值为v的新元素e并返回e。
a.PushBack("a")
b := a.PushBack("b")

func (l List) PushBackList(other List){}

PushBackList在列表l的后面插入另一个列表的副本。列表l和其他可以是相同的。他们一定不能为零。

func (l List) PushFront(v interface{}) Element{}

PushFront在列表l的前面插入一个值为v的新元素e并返回e。

func (l List) PushFrontList(other List){}

PushFrontList在列表l的前面插入另一个列表的副本。列表l和其他可以是相同的。他们一定不能为零。

func (l List) Remove(e Element) interface{}{}

如果e是列表l的元素,则删除从l中删除e。它返回元素值e.Value。元素不能为零。

func (e Element) Next() Element{}

Next返回下一个list元素或nil

func (e Element) Prev() Element{}

Prev返回前一个列表元素或nil。

取出链表中元素的值

x := a.Front()
fmt.Println(x.Value)

链表的遍历

for e := a.Front(); e != nil; e = e.Next() {
        fmt.Println(e.Value)
    }
输出:
3
a
b
mm

对于链表与切片的总结。

链表适合于频繁存取的数据结构中。
切片适合于频繁查询的数据结构中。

实例

package main
 
import (
    "container/list"
    "fmt"
)
 
func printList(coll *list.List) {
    for e := coll.Front(); e != nil; e = e.Next() {
    fmt.Print(e.Value, " ")
}
fmt.Println()
}
 
func printListR(coll *list.List) {
    for e := coll.Back(); e != nil; e = e.Prev() {
    fmt.Print(e.Value, " ")
}
fmt.Println()
}
 
func main() {
    coll := list.New()

    coll.PushBack(1)
    coll.PushBack("Gopher")

    coll.PushFront("Cynhard")
    two := coll.PushFront(2)

    before2 := coll.InsertBefore("Before2", two)
    after2 := coll.InsertAfter("After2", two)

    coll.MoveAfter(before2, two)
    coll.MoveBefore(after2, two)
    coll.MoveToFront(before2)
    coll.MoveToBack(after2)

    coll2 := list.New()
    coll2.PushBack(3)
    coll2.PushFront("Tomcat")

    coll.PushBackList(coll2)
    coll.PushFrontList(coll2)

    printList(coll)
    printListR(coll)

    fmt.Println(coll.Front().Value)
    fmt.Println(coll.Back().Value)

    fmt.Println(coll.Len())

    coll.Remove(two)

    printList(coll)

    coll.Init()
    printList(coll)
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×