如何为链接列表编写一个peek方法

时间:2011-10-06 19:18:44

标签: java stack peek

我正在为堆栈创建链接列表实现。我已经完成了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 个答案:

答案 0 :(得分:3)

听起来像LinearNode类需要一个toString()方法。

答案 1 :(得分:1)

pop()和peek()应返回LinearNode引用的内容,而不是实际的LinkedNode。

@SupressWarnings表明你没有正确地做泛型。删除它们,然后看看你要返回的内容 - 看起来你不会直接返回“T”而是返回LinkedNode。您不应该在此代码中使用任何SupressWarning。

如果你想存储字符串,那么你应该像这样定义堆栈:

LinkedStack<String> stack = new LinkedStack<String>();

您可以认为泛型类型T将代表堆栈类中的String。

在这种情况下,peek()方法签名将返回一个String。

另外:检查你的pop和push方法,两者都应该可以在O(1)中进行,但是,你正在遍历列表。你已经倒退了。

答案 2 :(得分:0)

您可以通过使用以下内容进行简单的查看:System.out.println(“顶部的元素是:”+ top.getElement); 并返回top.getElement。请记住,在顶部,您实际上是从堆栈顶部及其元素中删除节点。由于peek只实际看到堆栈的顶部元素,因此您不需要使用top = top.getNext或count--;。希望它有所帮助!