Enqueue如何处理链开始为空的特殊情况以及当链以一个节点开始时的Dequeue进程。
答案 0 :(得分:0)
OpenJDK implementation使用两个技巧:
队列包含一个始终存在的盲元素,即使在空队列中也是如此。盲元素始终是队列中的第一个元素,但在类外部不可见。
队列实际上是一个响铃。我们知道我们在currentElement.next == blind
时已到达最后一个元素。
下图说明了长度为0(左)和长度为1(右)的qeue队列。
使用这些技巧的好处是:
对于remove / deque,我们仍然需要检查队列是否为空。
<强>添加强>
newElement.next = head.next;
newElement.prev = head;
newElement.prev.next = newElement;
newElement.next.prev = newElement;
<强>卸下强>
if (head.next == head) {
// ERROR, queue is empty
} else {
removedElement.next.prev = removedElement.prev;
removedElement.prev.next = removedElement.next;
}
请注意,只使用一个额外的if-else语句就可以实现没有这些技巧的队列。 下图显示了一个长度为0(左)和长度为1(右)的天真实现队列。
<强>添加强>
if (head == null) {
// queue is empty
head = newElement;
} else {
// add to head
}
<强>卸下强>
if (head == null) {
// ERROR, queue is empty
} else {
// remove from tail
}