-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbinode.go
144 lines (110 loc) · 2.19 KB
/
binode.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
package list
import (
"sync"
)
type BiNode struct {
prev *BiNode
next *BiNode
val interface{}
}
var binodePool = sync.Pool{
New: func() interface{} {
return new(BiNode)
},
}
func new_binode() *BiNode {
n := binodePool.Get().(*BiNode)
n.prev = nil
n.next = nil
n.val = nil
return n
}
func delete_binode(n *BiNode) {
n.prev = nil
n.next = nil
n.val = nil
binodePool.Put(n)
}
func (cur *BiNode) InsertPrev(val interface{}) *BiNode {
n := new_binode()
n.val = val
n.prev = cur.prev
n.next = cur
cur.prev.next = n
cur.prev = n
return n
}
func (cur *BiNode) InsertNext(val interface{}) *BiNode {
n := new_binode()
n.val = val
n.prev = cur
n.next = cur.next
cur.next.prev = n
cur.next = n
return n
}
func (cur *BiNode) Value() interface{} {
return cur.val
}
func (cur *BiNode) Remove() interface{} {
cur.next.prev = cur.prev
cur.prev.next = cur.next
defer delete_binode(cur)
return cur.val
}
func AsForwardIterator(b, e *BiNode) Iterator {
return &BiNodeForwardIterator{cur: b, end: e}
}
func AsReverseIterator(b, e *BiNode) Iterator {
return &BiNodeReverseIterator{cur: b, end: e}
}
type BiNodeForwardIterator struct {
cur *BiNode
end *BiNode
}
func (it *BiNodeForwardIterator) Clone() Iterator {
dup := *it
return &dup
}
func (it *BiNodeForwardIterator) Next() {
it.cur = it.cur.next
}
func (it *BiNodeForwardIterator) RemoveAndNext() {
rm := it.cur
it.cur = it.cur.next
rm.Remove()
}
func (it *BiNodeForwardIterator) Insert(val interface{}) {
it.cur.InsertNext(val)
}
func (it *BiNodeForwardIterator) IsEnd() bool {
return it.cur == it.end
}
func (it *BiNodeForwardIterator) Value() interface{} {
return it.cur.val
}
type BiNodeReverseIterator struct {
cur *BiNode
end *BiNode
}
func (it *BiNodeReverseIterator) Clone() Iterator {
dup := *it
return &dup
}
func (it *BiNodeReverseIterator) Next() {
it.cur = it.cur.prev
}
func (it *BiNodeReverseIterator) RemoveAndNext() {
rm := it.cur
it.cur = it.cur.prev
rm.Remove()
}
func (it *BiNodeReverseIterator) Insert(val interface{}) {
it.cur.InsertPrev(val)
}
func (it *BiNodeReverseIterator) IsEnd() bool {
return it.cur == it.end
}
func (it *BiNodeReverseIterator) Value() interface{} {
return it.cur.val
}