github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/datastructures/queue/linked_queue.go (about) 1 package queue 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 type ( 9 node struct { 10 data interface{} 11 next *node 12 } 13 14 LinkedQueue struct { 15 head *node 16 tail *node 17 len int 18 } 19 ) 20 21 func newNode(v interface{}) *node { 22 return &node{v, nil} 23 } 24 25 var emptyNode = newNode(nil) 26 27 func NewLinkedQueue() *LinkedQueue { 28 return &LinkedQueue{nil, nil, 0} 29 } 30 31 func (q *LinkedQueue) Enqueue(v interface{}) bool { 32 nn := newNode(v) 33 if q.head == nil { 34 q.head = nn 35 } 36 if q.tail != nil { 37 q.tail.next = nn 38 } 39 q.tail = nn 40 q.len++ 41 return true 42 } 43 44 func (q *LinkedQueue) Dequeue() interface{} { 45 if q.IsEmpty() { 46 return nil 47 } 48 ret := q.head 49 q.head = q.head.next 50 q.len-- 51 return ret.data 52 } 53 54 func (q *LinkedQueue) IsEmpty() bool { 55 return q.Len() == 0 56 } 57 58 func (q *LinkedQueue) Len() int { 59 return q.len 60 } 61 62 func (q *LinkedQueue) String() string { 63 var sb strings.Builder 64 sb.WriteString("head ") 65 cur := q.head 66 for ; cur != nil; cur = cur.next { 67 sb.WriteString(fmt.Sprintf("%v->", cur.data)) 68 } 69 sb.WriteString("tail") 70 return sb.String() 71 }