Очередь реализована с использованием односвязного списка.
Переменная back "указывает" на первый узел в связанном списке. Новые элементы добавляются (ставятся в очередь) сзади.
Переменная передняя "указывает" на последний узел в связанном списке. Элементы удаляются (удаляются из очереди) с фронта.
Эта реализация противоположна обычной очереди, где задняя часть является последним узлом, а передняя часть - первым узлом. Я знаю, что это не очень хороший способ реализации очереди, но это хорошая практика кодирования со связанными списками.
Я написал функцию enqueue (), однако не уверен, что я делаю неправильно с dequeue ( ). Я должен добраться до фронта, который является последним узлом, чтобы удалить его из очереди. Поэтому я должен пройти через узел, чтобы удалить и вернуть элемент в начало очереди.
//Node stuff
private Node front, back;
static class Node {
public Node (char item, Node next) { this.item = item; this.next = next; }
public char item;
public Node next;
}
функция удаления: требуется работа
public char dequeue() {
char item;
if (back.item == front.item) {
item = front.item;
back = null;
}
for (Node tmp = back; tmp != null; tmp= tmp.next){
if (tmp.next == null){
item = tmp.item;
back.next = null;
}
}
return item;
}
Я создал символ для хранения значения элемента, который я собираюсь удалить ... Моя проблема заключается в удалении последнего узла из списка. Я не уверен, как это сделать, не получив исключение Null Pointer. Любой вклад будет высоко ценится!