Контекст из книги Брюс Эккель "Философия Java" (стр.507-508):
Вместо использования LinkedList мы также могли реализовать собственный механизм внутреннего хранения данных.
public class LinkedStack<T> {
private static class Node<U> {
U item;
Node<U> next;
Node() { item = null; next = null; }
Node(U item, Node<U> next) {
this.item = item;
this.next = next;
}
boolean end() { return item == null && next == null; }
}
private Node<T> top = new Node<T>(); // Сторож
public void push(T item) {
top = new Node<T>(item, top);
}
public T pop() {
T result = top.item;
if(!top.end())
top = top.next;
return result;
}
public static void main(String[] args) {
LinkedStack<String> lss = new LinkedStack<String>();
for(String s : "Phasers on stun!".split(" "))
lss.push(s);
String s;
while((s = lss.pop()) != null)
System.out.println(s));
}
}
/* Output:
stun!
on
Phasers
В этом примере для определения пустого стека используется сторож (end sentinel).
Сторож создается при конструировании LinkedStack, и при каждом вызове push()
новый узел Node создается и связывается с предыдущим узлом Node.
Есть несколько вопросов по коду:
1. Зачем нужно создавать так называемого "сторожа"
private Node<T> top = new Node<T>();
если всё равно при вызове метода
lss.push(s);
внутри него создаётся объект с таким же именем?
top = new Node<T>(item, top);
2. Как вновь созданный новый узел связывается с предыдущим узлом, если в методе
public void push(T item) {
top = new Node<T>(item, top);
}
второй параметр
top
является ссылкой на самого себя
top = new Node<T>(item, top);
?
но по если смотреть по структуре класса это же должен быть следующий
Node<U> next