从Java中的链表中删除头

时间:2012-11-09 16:43:57

标签: java linked-list

这应该是一个相当基本的问题,但我不能为我的生活弄清楚。我正在使用我的讲师给我的两个文件,我必须编写一个方法removeFirst,它将从声明的链表中删除头部并返回旧的头部值。它不能采取任何参数。这是file 1file 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));
}

3 个答案:

答案 0 :(得分:6)

您需要return head;而不是return cur;

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

据推测,removeHead()是列表类中的实例方法。您不需要传递参数,因为该列表在方法中可用作this

查看aList的类定义会有所帮助。您的file 1链接表示它是MyLinkedList.java,但其中粘贴的代码是IntNode.java。

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

aList.print(aList.getHead());

答案 1 :(得分:1)

我认为你做的很好,除了回归。您需要返回head代替cur,因为cur表示已移除的head节点(上一个)。

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 

答案 2 :(得分: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);