一、介绍
go语言提供了原生的双向链表,在源码 src/container/list/list.go
双向链表中,每一个元素有prev,和next两个方向。
源码中元素Element对应的 结构体为:
// Element is an element of a linked list.
type Element struct {
//像一个,上下一个元素
next, prev *Element
// The list to which this element belongs.
list *List
// The value stored with this element.
Value interface{}
}
源码中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
}
通过New()函数,新建一个list。
// New returns an initialized list.
func New() *List { return new(List).Init() }
// Init initializes or clears list l.
func (l *List) Init() *List {
l.root.next = &l.root
l.root.prev = &l.root
l.len = 0
return l
}
源码中实现一个新list分为两步
1、new一个新list结构体
2、初始化root的元素的 prev以及next
使用举例:
import (
"container/list"
"testing"
)
func TestNew(t *testing.T) {
l := list.New()
t.Log(l) //&{{0xc000060360 0xc000060360 <nil> <nil>} 0}
t.Log(l.Len()) //0
t.Log(l.Front()) //nil
t.Log(l.Back()) //nil
}
输出:
&{{0xc000116300 0xc000116300 <nil> <nil>} 0}
0
<nil>
<nil>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。