-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathdouble_list.go
150 lines (135 loc) · 2.35 KB
/
double_list.go
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
package linked_list
import (
"sync"
)
type DoubleNode struct {
Data interface{}
Prev *DoubleNode
Next *DoubleNode
}
type DoubleList struct {
Size int
mu *sync.Mutex
Head *DoubleNode
Tail *DoubleNode
}
func NewDoubleList() *DoubleList {
var l = new(DoubleList)
l.Size = 0
l.Head = nil
l.Tail = nil
l.mu = new(sync.Mutex)
return l
}
func (l *DoubleList) Append(node *DoubleNode) bool {
l.mu.Lock()
defer l.mu.Unlock()
if node == nil {
return false
}
node.Next = nil
if l.Size == 0 {
l.Head = node
node.Prev = nil
} else {
old := l.Tail
old.Next = node
node.Prev = old
}
l.Tail = node
l.Size++
return true
}
func (l *DoubleList) InsertNext(node *DoubleNode, data *DoubleNode) bool {
if node == nil || data == nil {
return false
}
defer func() {
}()
if l.IsTail(node) {
l.Append(data)
} else {
l.mu.Lock()
defer l.mu.Unlock()
//取出要插入节点的下一个节点(替换该节点)
old := node.Next
old.Prev = data
data.Prev = node
data.Next = old
node.Next = data
l.Size++
}
return true
}
func (l *DoubleList) InsertPrev(node *DoubleNode, data *DoubleNode) bool {
if node == nil || data == nil {
return false
}
l.mu.Lock()
defer l.mu.Unlock()
if l.IsHead(node) {
old := node
old.Prev = data
data.Prev = nil
data.Next = old
l.Head = data
} else {
//拿当前节点上一个节点数据
old := node.Prev
old.Next = data
data.Prev = old
data.Next = node
node.Prev = data
}
l.Size++
return true
}
func (l *DoubleList) Get(i int) *DoubleNode {
if i >= l.Size || i < 0 {
return nil
}
node := l.Head
for j := 0; j < i; j++ {
node = node.Next
}
return node
}
func (l *DoubleList) GetAll() []interface{} {
var data []interface{}
node := l.Head
for {
data = append(data, node.Data)
if node.Next == nil {
break
}
node = node.Next
}
return data
}
func (l *DoubleList) GetAllV2() []interface{} {
var data []interface{}
node := l.Head
for node != nil {
data = append(data, node.Data)
node = node.Next
}
return data
}
func (l *DoubleList) GetHead() *DoubleNode {
return l.Head
}
func (l *DoubleList) GetTail() *DoubleNode {
return l.Tail
}
func (l *DoubleList) IsHead(node *DoubleNode) bool {
if l.GetHead() == node {
return true
}
return false
}
func (l *DoubleList) IsTail(node *DoubleNode) bool {
if l.GetTail() == node {
return true
}
return false
}