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  }