golang container list实现

golang源码中的container列表实现。

源码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
// 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 *List

// The value stored with this element.
// 节点的值
Value any
}

// Next 返回下一个节点口的指针
func (e *Element) Next() *Element {
// 如果e.list != nil 且下一个节点不是root则返回e.next
if p := e.next; e.list != nil && p != &e.list.root {
return p
}
return nil
}

// Prev 返回上一个节点的指针
func (e *Element) Prev() *Element {
// 如果e.list != nil 且下一个节点不是root则返回e.prev
if p := e.prev; e.list != nil && p != &e.list.root {
return p
}
return nil
}

// List 表示一个双向链表
// 链表的最后一个节点的next指针和链表的第一个节点的prev指针都指向root
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
}

// Init 初始化或清除一个列表
func (l *List) Init() *List {
l.root.next = &l.root
l.root.prev = &l.root
l.len = 0
return l
}

// New 初始化一个列表并返回其指针
func New() *List { return new(List).Init() }

// Len 返回列表的长度
func (l *List) Len() int { return l.len }

// Front 返回列表的第一个节点指针
func (l *List) Front() *Element {
if l.len == 0 {
return nil
}
return l.root.next
}

// Back 返回列表的最后一个指针
func (l *List) Back() *Element {
if l.len == 0 {
return nil
}
return l.root.prev
}

// lazyInit lazily initializes a zero List value.
func (l *List) lazyInit() {
if l.root.next == nil {
l.Init()
}
}

// insert 在节点at之后插入节点e, 并返回节点e指针
func (l *List) insert(e, at *Element) *Element {
e.prev = at
e.next = at.next
e.prev.next = e
e.next.prev = e
e.list = l
l.len++
return e
}
// insertValue 对insert的封装
func (l *List) insertValue(v any, at *Element) *Element {
return l.insert(&Element{Value: v}, at)
}

// remove 将节点从列表中移除
func (l *List) remove(e *Element) {
e.prev.next = e.next
e.next.prev = e.prev
e.next = nil // avoid memory leaks
e.prev = nil // avoid memory leaks
e.list = nil
l.len--
}

// move 将节点e移动到节点at之后
func (l *List) move(e, at *Element) {
if e == at {
return
}
e.prev.next = e.next
e.next.prev = e.prev

e.prev = at
e.next = at.next
e.prev.next = e
e.next.prev = e
}

// Remove 将节点从列表中移除
func (l *List) Remove(e *Element) any {
if e.list == l {
// if e.list == l, l must have been initialized when e was inserted
// in l or l == nil (e is a zero Element) and l.remove will crash
l.remove(e)
}
return e.Value
}

// PushFront 将节点插入到列表头
func (l *List) PushFront(v any) *Element {
l.lazyInit()
return l.insertValue(v, &l.root)
}

// PushBack 将节点插入到列表尾部
func (l *List) PushBack(v any) *Element {
l.lazyInit()
return l.insertValue(v, l.root.prev)
}

// InsertBefore 将v插入到节点mark之前
func (l *List) InsertBefore(v any, mark *Element) *Element {
if mark.list != l {
return nil
}
// see comment in List.Remove about initialization of l
return l.insertValue(v, mark.prev)
}

// InsertAfter 将v插入到节点mark之后
func (l *List) InsertAfter(v any, mark *Element) *Element {
if mark.list != l {
return nil
}
// see comment in List.Remove about initialization of l
return l.insertValue(v, mark)
}

// MoveToFront 将节点e移动到列表头
func (l *List) MoveToFront(e *Element) {
if e.list != l || l.root.next == e {
return
}
// see comment in List.Remove about initialization of l
l.move(e, &l.root)
}

// MoveToBack 将节点e移动到列表末尾
func (l *List) MoveToBack(e *Element) {
if e.list != l || l.root.prev == e {
return
}
// see comment in List.Remove about initialization of l
l.move(e, l.root.prev)
}

// MoveBefore 将节点e移动到mark之前
func (l *List) MoveBefore(e, mark *Element) {
if e.list != l || e == mark || mark.list != l {
return
}
l.move(e, mark.prev)
}

// MoveAfter 将节点e移动到mark之后
func (l *List) MoveAfter(e, mark *Element) {
if e.list != l || e == mark || mark.list != l {
return
}
l.move(e, mark)
}

// PushBackList 将一个列表中的所有元素加入l中,在l之后
func (l *List) PushBackList(other *List) {
l.lazyInit()
for i, e := other.Len(), other.Front(); i > 0; i, e = i-1, e.Next() {
l.insertValue(e.Value, l.root.prev)
}
}

// PushFrontList 将一个列表中的所有元素加入l中,在l之前
func (l *List) PushFrontList(other *List) {
l.lazyInit()
for i, e := other.Len(), other.Back(); i > 0; i, e = i-1, e.Prev() {
l.insertValue(e.Value, &l.root)
}
}

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
"container/list"
"fmt"
)

func main() {
l := list.New()
e4 := l.PushBack(4)
e1 := l.PushFront(1)
l.InsertBefore(3, e4)
l.InsertAfter(2, e1)

// Iterate through list and print its contents.
for e := l.Front(); e != nil; e = e.Next() {
fmt.Println(e.Value)
}
}

REF:

  1. container/list/list.go