Как постановка в очередь и снятие с очереди работают при связанной реализации очереди

#java #data-structures #queue

#java #структуры данных #очередь

Вопрос:

Как Enqueue обрабатывает особый случай, когда цепочка начинается с пустого, и процесс удаления из очереди, когда цепочка начинается с одного узла.

Комментарии:

1. О какой реализации вы говорите? Вы просмотрели исходный код? Что вас смущает в этом случае?

2. Я хочу понять, каков процесс постановки в очередь и удаления из очереди при связанной реализации..

Ответ №1:

Реализация OpenJDK использует два приема:

  1. Очередь содержит слепой элемент, который всегда присутствует, даже в пустой очереди. Слепой элемент всегда является первым элементом в очереди, но не виден извне класса.

  2. Очередь на самом деле является кольцом. Мы знаем, что мы достигли последнего элемента, когда currentElement.next == blind .

На следующем рисунке показана такая очередь длиной 0 (слева) и qeue длиной 1 (справа).

очередь с хитростями

Преимущества использования этих приемов:

  • нет нулевых указателей
  • нет if-else для добавления / постановки в очередь элементов

Для удаления / удаления нам все равно нужно проверить, пуста ли очередь.

Добавление

 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
}