1

这应该是一个相当基本的问题,但我一生都无法弄清楚。我正在使用我的导师给我的两个文件,我必须编写一个方法removeFirst来从声明的链表中删除头部并返回旧的头部值。它不能接受任何参数。这是文件 1文件 2

我的 removeFirst 和调试代码如下。我不知道如何在aList不能将其用作参数的情况下引用它,尤其是因为链表不是全局的。当我使用调试代码时,它会打印aList,然后打印21(它应该删除的列表的头部,以及removeFirst应该返回的内容),但是它不打印更新的链表——它只是空白。

removeFirst代码:

public IntNode removeFirst() {
    IntNode cur = getHead();

    head = cur.getNext();
    head.setPrev(null);

    cur.setNext(null);

    return cur;
}

调试代码(在底部main):

for(int i = 0; i < aList.size(aList.getHead()); i++) {
    aList.print(aList.findObject(i));
}

aList.print(aList.removeFirst());
System.out.println("");

for(int j = 0; j < aList.size(aList.getHead()); j++) {
    aList.print(aList.findObject(j));
}
4

3 回答 3

6

你需要return head;代替return cur;

编辑对不起。我显然误解了你的问题陈述。如果该removeFirst()方法应该返回列表的头,则上述内容是合适的。如果它应该返回已删除的元素(在您对原始帖子的评论和编辑之后现在很清楚),那么它应该可以正常工作。

大概removeHead()是您的列表类中的一个实例方法。您不需要传递参数,因为列表this在方法内部可用。

这将有助于查看aList. 您的file 1链接说它指向 MyLinkedList.java,但粘贴的代码是用于 IntNode.java。

编辑 2我认为,问题可能出在您的调试代码上。findObject(j)不返回列表的j第 th 个j元素——它返回包含作为值的列表元素。从代码来看,它看起来像是MyLinkedList.print(IntNode)从指定的节点开始打印整个列表。如果您将for调试代码中的循环简单地替换为:

aList.print(aList.getHead());
于 2012-11-09T16:45:53.537 回答
1

我认为除了返回之外,您一切都很好。您需要返回原样head以表示已删除的节点(前一个)。curcurhead

public IntNode removeFirst() {
    IntNode cur = getHead();

     head = cur.getNext();
     head.setPrev(null);

     cur.setNext(null);

     return head;
 }

编辑:既然你已经更新了你的问题,这是你第二个问题的答案;

您可以参考aList使用this运算符。

更新:我removeFirst()在你的类中添加了方法,MyLinkedList然后我在你的方法中添加了这些语句(最后)

    aList.removeFirst();
    aList.print(aList.getHead());
    System.out.println("");

它工作正常并将输出打印为:

    84 88 92 96 100 
    100 96 92 88 84 
    Size = 5
    Adding another IntNode
    21 84 88 92 96 100 
    Adding yet another IntNode
    21 52 84 88 92 96 100 
    The object is 92
    The object containing 50 was not found.
    The object removed has 96 in it.
    The object containing 50 was not found. Nothing was removed.
    21 52 84 88 92 100 
    Removing Head
    52 84 88 92 100 
于 2012-11-09T16:47:57.593 回答
1

我的假设是,由于您通过引用访问所有对象,因此在执行removeFirst()

IntNode cur = getHead();

如同

cur = head;

因为它们可以在同一范围内访问。通过在执行时执行此操作:

head.setPrev(null);
...
cur.setNext(null);

你基本上是这样做的:

head.setPrev(null);
...
head.setNext(null);

或者....

null <-- head --> null

看看这是怎么回事?

您的目标是获取要删除的节点的副本,然后销毁该副本对列表的引用。

IntNode cur = new IntNode(getHead().getVal());

当您尝试从节点中删除旧头时:

head.setNext(head.getNext());
head.setPrev(null);
于 2012-11-09T17:07:57.017 回答