【问题标题】:How to code a peek method for Linked List如何为链表编写 peek 方法
【发布时间】:2011-10-06 19:18:43
【问题描述】:

我正在为堆栈创建一个链表实现。我已经完成了 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 方法的输出:

线性节点@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;
}

}

【问题讨论】:

  • 如果这是作业,请添加“作业”标签。
  • “我似乎无法获得 peek 方法”是什么意思?你得到一个编译错误?堆栈跟踪?输出不正确?请阅读此链接:stackoverflow.com/questions/how-to-ask
  • 我认为您的代码是正确的。您是否正在对 peek 的结果进行系统输出?如果是这样,您可能会看到一个内存地址,因为它是 T 类型的对象。
  • 这是我调用 peek 方法时的输出:LinearNode@33f42b49
  • 它不是内存地址,它的 Object.toString() (即 .hashcode() 十六进制...)

标签: java stack peek


【解决方案1】:

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

【讨论】:

  • 或者在打印方法中调用LinearNode.getFoo(),而不是仅仅打印Linearnode。 \
  • LinearNode 不应该从 peek() 和 pop() 方法返回(因为它们应该返回 LinearNode 保持引用的任何内容 - 一个 `T' )所以 toString() 方法是不是很有用,只会掩盖 Brock 代码中存在的类型错误。
【解决方案2】:

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

@SupressWarnings 表明您没有正确使用泛型。删除它们,然后查看您返回的内容 - 看起来您返回的不是“T”,而是直接返回 LinkedNode。这段代码中不需要任何 SupressWarnings。

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

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

您可以认为泛型类型T 将在您的堆栈类中表示一个字符串。

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

另外:检查您的 pop 和 push 方法,两者都应该能够在 O(1) 中完成,但是,您正在遍历列表。你把它弄反了。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-12
      • 2021-02-11
      • 2017-08-23
      • 2022-10-03
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      相关资源
      最近更新 更多