File size: 1,679 Bytes
dca6a23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package queue

type (
	Queue struct {
		start, end *Node
		length     int
	}
	Node struct {
		Value interface{}
		next  *Node
	}
)

// New 新建一个队列
func New() *Queue {
	return &Queue{nil, nil, 0}
}

// Dequeue 出队
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
}

// Enqueue 入队
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++
}

// Len 获取队列长度
func (Q *Queue) Len() int {
	return Q.length
}

// Peek 返回队列的第一个元素
func (Q *Queue) Peek() *Node {
	if Q.length == 0 {
		return nil
	}
	return Q.start
}

// Remove 移除指定节点
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 {
			// 如果移除后队列为空,则end也应该设置为nil
			Q.end = nil
		}
		Q.length--
		return
	}

	// 找到n的前一个节点
	prevNode := Q.start
	for prevNode != nil && prevNode.next != n {
		prevNode = prevNode.next
	}

	if prevNode == nil {
		// 没有找到n的前一个节点(n不在队列中)
		return
	}

	// 移除节点n
	prevNode.next = n.next
	// 如果移除的是最后一个元素,更新end指针
	if n.next == nil {
		Q.end = prevNode
	}
	Q.length--
}

// Traverse 遍历队列
func (Q *Queue) Traverse(cb func(n *Node)) {
	if Q.length == 0 {
		return
	}
	for n := Q.start; n != nil; n = n.next {
		cb(n)
	}
}