Как кодировать метод просмотра для связанного списка
Я создаю реализацию связанного списка для стека. У меня есть метод pop и push, но я не могу понять, что метод peek правильный. Код, который у меня сейчас есть, возвращает адрес памяти, который я думаю.
Вот мой код:
public class LinkedStack<T> implements StackADT<T> {
private int count;
private LinearNode<T> contents;
public LinkedStack() {
count = 0;
contents = null;
}
@Override
public void push(T element) {
LinearNode<T> top = new LinearNode<T>(element);
if (contents == null) {
contents = top;
} else {
LinearNode<T> current = contents;
while (current.getNext() != null) {
current = current.getNext();
}
current.setNext(top);
}
count++;
}
@SuppressWarnings("unchecked")
@Override
public T pop() {
T item = (T) contents;
contents = contents.getNext();
count--;
return item;
}
@SuppressWarnings("unchecked")
@Override
public T peek() throws NoSuchOperationException {
T top = (T) contents;
if(top == null){
throw new NoSuchOperationException();
}
return top;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return false;
}
@Override
public int size() {
return count;
}
}
Это то, что он выводит, когда я вызываю метод peek. Я использовал свой метод push для добавления объекта и протестировал его методом size. Это показало, что я добавил элемент. Затем я вызвал метод pop и снова отобразил размер, чтобы убедиться, что он работает.
Это мой вывод метода peek:
LinearNode @ 33f42b49
Вот мой класс LinearNode:
public class LinearNode<T> {
private T element;
private LinearNode<T> next;
public LinearNode() {
this.element = null;
this.next = null;
}
public LinearNode(T element) {
this.element = element;
this.next = null;
}
public T getElement() {
return element;
}
public void setElement(T _element) {
this.element = _element;
}
public LinearNode<T> getNext() {
return next;
}
public void setNext(LinearNode<T> next) {
this.next = next;
}
}
3 ответа
pop() и peek() должны возвращать то, на что ссылается LinearNode, а не фактический LinkedNode.
@SupressWarnings указывает на то, что вы не делаете дженерики правильно. Удалите их и посмотрите, что вы возвращаете - похоже, вы возвращаете не `T', а непосредственно LinkedNode. Вам не нужно никаких предупреждений SupressWarnings в этом коде.
Если вы хотите хранить строки, то вы должны определить стек следующим образом:
LinkedStack<String> stack = new LinkedStack<String>();
Вы можете думать, что общий тип T
будет представлять String внутри вашего стека класса.
В этом случае peek()
сигнатура методов затем возвращает строку.
Также: проверьте ваши методы pop и push, оба должны быть в состоянии в O(1), однако вы просматриваете список. Вы получили это задом наперед.
Вы можете просто просмотреть, используя: System.out.println("Элемент сверху: " + top.getElement); и верните top.getElement. Помните, что на самом деле вы фактически удаляете Node из верхней части стека и его элемента. Поскольку peek фактически видит только верхний элемент стека, вам не нужно использовать top = top.getNext или count--;. Надеюсь, поможет!