gitee.com/h79/goutils@v1.22.10/common/queue/linked.go (about) 1 package queue 2 3 type node struct { 4 next *node 5 val any 6 } 7 8 var _ Queue = (*Linked)(nil) 9 10 // Linked 链表式队列 11 type Linked struct { 12 head *node 13 tail *node 14 length int 15 capacity int 16 } 17 18 func NewLinked(capacity int) *Linked { 19 if capacity <= 0 { 20 capacity = minCapacity 21 } 22 if capacity > maxCapacity { 23 capacity = maxCapacity 24 } 25 return &Linked{capacity: capacity} 26 } 27 28 func (lq *Linked) Add(val any) error { 29 if lq.length >= lq.capacity { 30 return ErrIsFull 31 } 32 item := &node{ 33 val: val, 34 } 35 item.next = lq.head 36 lq.head = item 37 lq.length++ 38 return nil 39 } 40 41 func (lq *Linked) AddTail(val any) error { 42 if lq.length >= lq.capacity { 43 return ErrIsFull 44 } 45 item := &node{ 46 val: val, 47 } 48 if lq.tail == nil { 49 lq.head = item 50 } else { 51 lq.tail.next = item 52 } 53 lq.length++ 54 lq.tail = item 55 return nil 56 } 57 58 func (lq *Linked) Push(val any) error { 59 return lq.Add(val) 60 } 61 62 func (lq *Linked) Pop() any { 63 if lq.head != nil { 64 val := lq.head.val 65 lq.head = lq.head.next 66 if lq.head == nil { 67 lq.tail = nil 68 } 69 lq.length-- 70 return val 71 } 72 return nil 73 } 74 75 func (lq *Linked) Peek() any { 76 if lq.head != nil { 77 return lq.head.val 78 } 79 return nil 80 } 81 82 func (lq *Linked) Empty() bool { 83 return lq.head == nil 84 } 85 86 func (lq *Linked) Len() int { 87 return lq.length 88 } 89 90 func (lq *Linked) Cap() int { 91 return lq.length 92 } 93 94 // Find return index -1 not found. 95 func (lq *Linked) Find(fn IndexFunc) (any, int) { 96 index := 0 97 for i := lq.head; i != nil; i = i.next { 98 if fn(i.val, index) { 99 return i.val, index 100 } 101 index++ 102 } 103 return nil, -1 104 } 105 106 func (lq *Linked) Foreach(fn IndexFunc) { 107 index := 0 108 for i := lq.head; i != nil; i = i.next { 109 if fn(i.val, index) { 110 return 111 } 112 index++ 113 } 114 } 115 116 func (lq *Linked) ToList() []any { 117 buf := make([]any, lq.Len()) 118 index := 0 119 for i := lq.head; i != nil; i = i.next { 120 buf[index] = i.val 121 index++ 122 } 123 return buf 124 }