在队列的链接实现下,Enqueue和Dequeue如何工作

时间:2016-10-03 23:23:31

标签: java data-structures queue

Enqueue如何处理链开始为空的特殊情况以及当链以一个节点开始时的Dequeue进程。

1 个答案:

答案 0 :(得分:0)

OpenJDK implementation使用两个技巧:

  1. 队列包含一个始终存在的盲元素,即使在空队列中也是如此。盲元素始终是队列中的第一个元素,但在类外部不可见。

  2. 队列实际上是一个响铃。我们知道我们在currentElement.next == blind时已到达最后一个元素。

  3. 下图说明了长度为0(左)和长度为1(右)的qeue队列。

    queue with tricks

    使用这些技巧的好处是:

    • 没有空指针
    • 没有if-else用于添加/排队元素

    对于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(右)的天真实现队列。

    naive queue

    <强>添加

    if (head == null) {
        // queue is empty
        head = newElement;
    } else {
        // add to head
    }
    

    <强>卸下

    if (head == null) {
        // ERROR, queue is empty
    } else {
        // remove from tail
    }