|
|
package queue |
|
|
|
|
|
type ( |
|
|
Queue struct { |
|
|
start, end *Node |
|
|
length int |
|
|
} |
|
|
Node struct { |
|
|
Value interface{} |
|
|
next *Node |
|
|
} |
|
|
) |
|
|
|
|
|
|
|
|
func New() *Queue { |
|
|
return &Queue{nil, nil, 0} |
|
|
} |
|
|
|
|
|
|
|
|
func (Q *Queue) Dequeue() *Node { |
|
|
if Q.length == 0 { |
|
|
return nil |
|
|
} |
|
|
n := Q.start |
|
|
if Q.length == 1 { |
|
|
Q.start = nil |
|
|
Q.end = nil |
|
|
} else { |
|
|
Q.start = Q.start.next |
|
|
} |
|
|
Q.length-- |
|
|
return n |
|
|
} |
|
|
|
|
|
|
|
|
func (Q *Queue) Enqueue(value interface{}) { |
|
|
n := &Node{value, nil} |
|
|
if Q.length == 0 { |
|
|
Q.start = n |
|
|
Q.end = n |
|
|
} else { |
|
|
Q.end.next = n |
|
|
Q.end = n |
|
|
} |
|
|
Q.length++ |
|
|
} |
|
|
|
|
|
|
|
|
func (Q *Queue) Len() int { |
|
|
return Q.length |
|
|
} |
|
|
|
|
|
|
|
|
func (Q *Queue) Peek() *Node { |
|
|
if Q.length == 0 { |
|
|
return nil |
|
|
} |
|
|
return Q.start |
|
|
} |
|
|
|
|
|
|
|
|
func (Q *Queue) Remove(n *Node) { |
|
|
if Q.length == 0 || n == nil { |
|
|
return |
|
|
} |
|
|
|
|
|
|
|
|
if n == Q.start { |
|
|
Q.start = Q.start.next |
|
|
if Q.start == nil { |
|
|
|
|
|
Q.end = nil |
|
|
} |
|
|
Q.length-- |
|
|
return |
|
|
} |
|
|
|
|
|
|
|
|
prevNode := Q.start |
|
|
for prevNode != nil && prevNode.next != n { |
|
|
prevNode = prevNode.next |
|
|
} |
|
|
|
|
|
if prevNode == nil { |
|
|
|
|
|
return |
|
|
} |
|
|
|
|
|
|
|
|
prevNode.next = n.next |
|
|
|
|
|
if n.next == nil { |
|
|
Q.end = prevNode |
|
|
} |
|
|
Q.length-- |
|
|
} |
|
|
|
|
|
|
|
|
func (Q *Queue) Traverse(cb func(n *Node)) { |
|
|
if Q.length == 0 { |
|
|
return |
|
|
} |
|
|
for n := Q.start; n != nil; n = n.next { |
|
|
cb(n) |
|
|
} |
|
|
} |
|
|
|