@@ -150,7 +150,7 @@ mutable struct ReusableLinkedList{T} <: AbstractVector{T}
150
150
tail:: Union{ReusableNode{T},Nothing}
151
151
free_nodes:: ReusableNode{T}
152
152
null:: T
153
- len :: Int
153
+ maxlen :: Int
154
154
function ReusableLinkedList {T} (null, N) where T
155
155
free_root = ReusableNode {T} (null, nothing )
156
156
for _ in 1 : N
@@ -163,6 +163,7 @@ mutable struct ReusableLinkedList{T} <: AbstractVector{T}
163
163
end
164
164
Base. eltype (list:: ReusableLinkedList{T} ) where T = T
165
165
function Base. getindex (list:: ReusableLinkedList{T} , idx:: Integer ) where T
166
+ checkbounds (list, idx)
166
167
node = list. head
167
168
for _ in 1 : (idx- 1 )
168
169
node === nothing && throw (BoundsError (list, idx))
@@ -172,6 +173,7 @@ function Base.getindex(list::ReusableLinkedList{T}, idx::Integer) where T
172
173
return node. value
173
174
end
174
175
function Base. setindex! (list:: ReusableLinkedList{T} , value:: T , idx:: Integer ) where T
176
+ checkbounds (list, idx)
175
177
node = list. head
176
178
for _ in 1 : (idx- 1 )
177
179
node === nothing && throw (BoundsError (list, idx))
@@ -199,7 +201,29 @@ function Base.push!(list::ReusableLinkedList{T}, value) where T
199
201
end
200
202
return list
201
203
end
204
+
202
205
function Base. pop! (list:: ReusableLinkedList{T} ) where T
206
+ if list. head === nothing
207
+ throw (ArgumentError (" list must be non-empty" ))
208
+ end
209
+ prev = node = list. head
210
+ while node. next != = nothing
211
+ prev = node
212
+ node = node. next
213
+ end
214
+ if prev != = node
215
+ list. tail = prev
216
+ else
217
+ list. head = list. tail = nothing
218
+ end
219
+ prev. next = nothing
220
+ node. next = list. free_nodes
221
+ list. free_nodes = node
222
+ value = node. value
223
+ node. value = list. null
224
+ return value
225
+ end
226
+ function Base. popfirst! (list:: ReusableLinkedList{T} ) where T
203
227
if list. head === nothing
204
228
throw (ArgumentError (" list must be non-empty" ))
205
229
end
0 commit comments