Golang标准库——container/list

DevilRoshan · · 767 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

list

list包实现了双向链表。

type Element

type Element struct {
    // Next and previous pointers in the doubly-linked list of elements.
    // To simplify the implementation, internally a list l is implemented
    // as a ring, such that &l.root is both the next element of the last
    // list element (l.Back()) and the previous element of the first list
    // element (l.Front()).
    next, prev *Element

    // The list to which this element belongs.
    list *List

    // The value stored with this element.
    Value interface{}
}

Element类型代表是双向链表的一个元素。

func (*Element) Next

func (e *Element) Next() *Element

Next返回链表的后一个元素或者nil。

func (*Element) Prev

func (e *Element) Prev() *Element

Prev返回链表的前一个元素或者nil。

type List

type List struct {
    root Element // sentinel list element, only &root, root.prev, and root.next are used
    len  int     // current list length excluding (this) sentinel element
}

代表一个双向链表。List零值为一个空的、可用的链表。

func New

func New() *List

New创建一个链表。

func (*List) Init

func (l *List) Init() *List

Init清空链表。

func (*List) Len

func (l *List) Len() int

Len返回链表中元素的个数,复杂度O(1)。

func (*List) Front

func (l *List) Front() *Element

Front返回链表第一个元素或nil。

func (*List) Back

func (l *List) Back() *Element

Back返回链表最后一个元素或nil。

func (*List) PushFront

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

PushBack将一个值为v的新元素插入链表的第一个位置,返回生成的新元素。

func (*List) PushFrontList

func (l *List) PushFrontList(other *List)

PushFrontList创建链表other的拷贝,并将拷贝的最后一个位置连接到链表l的第一个位置。

func (*List) PushBack

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

PushBack将一个值为v的新元素插入链表的最后一个位置,返回生成的新元素。

func (*List) PushBackList

func (l *List) PushBackList(other *List)

PushBack创建链表other的拷贝,并将链表l的最后一个位置连接到拷贝的第一个位置。

func (*List) InsertBefore

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

InsertBefore将一个值为v的新元素插入到mark前面,并返回生成的新元素。如果mark不是l的元素,l不会被修改。

func (*List) InsertAfter

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

InsertAfter将一个值为v的新元素插入到mark后面,并返回新生成的元素。如果mark不是l的元素,l不会被修改。

func (*List) MoveToFront

func (l *List) MoveToFront(e *Element)

MoveToFront将元素e移动到链表的第一个位置,如果e不是l的元素,l不会被修改。

func (*List) MoveToBack

func (l *List) MoveToBack(e *Element)

MoveToBack将元素e移动到链表的最后一个位置,如果e不是l的元素,l不会被修改。

func (*List) MoveBefore

func (l *List) MoveBefore(e, mark *Element)

MoveBefore将元素e移动到mark的前面。如果e或mark不是l的元素,或者e==mark,l不会被修改。

func (*List) MoveAfter

func (l *List) MoveAfter(e, mark *Element)

MoveAfter将元素e移动到mark的后面。如果e或mark不是l的元素,或者e==mark,l不会被修改。

func (*List) Remove

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

Remove删除链表中的元素e,并返回e.Value。

func main() {
   l := list.New()

   for i := 0; i < 5; i++ {
      l.PushBack(i)
   }
   for e := l.Front(); e != nil; e = e.Next() {
      fmt.Print(e.Value) //01234
   }
   fmt.Println("")
   fmt.Println(l.Front().Value) //0
   fmt.Println(l.Back().Value)  //4

   l.InsertAfter(6, l.Front())  //首部元素之后插入一个值为6的元素
   for e := l.Front(); e != nil; e = e.Next() {
      fmt.Print(e.Value) //061234
   }
   fmt.Println("")
   l.MoveBefore(l.Front().Next(), l.Front()) //首部两个元素位置互换
   for e := l.Front(); e != nil; e = e.Next() {
      fmt.Print(e.Value) //601234
   }
   fmt.Println("")
   l.MoveToFront(l.Back()) //将尾部元素移动到首部
   for e := l.Front(); e != nil; e = e.Next() {
      fmt.Print(e.Value) //,460123
   }
   fmt.Println("")
   l2 := list.New()

   for i := 0; i < 5; i++ {
      l2.PushBack(i)
   }
   l2.PushBackList(l) //将l中元素放在l2的末尾
   for e := l2.Front(); e != nil; e = e.Next() {
      fmt.Print(e.Value) //01234460123
   }
   fmt.Println("")

   l.Init() //清空l
   fmt.Print(l.Len())                  //0
   for e := l.Front(); e != nil; e = e.Next() {
      fmt.Print(e.Value) //
   }
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:DevilRoshan

查看原文:Golang标准库——container/list

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

767 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传