链接列表 - 无法弄清楚为什么删除最后一个函数不起作用?

时间:2013-11-17 00:34:58

标签: java function methods linked-list

我删除了最后一个函数,它似乎应该可以工作,但是当我调用它时,实际上并没有删除任何东西,所有节点仍然存在。

它有什么问题吗?

  public Object removeLast()
    {
        Node currentNode;
        currentNode = this.getHead();
        while(currentNode != null)
        {

            if(currentNode.getNext()==null)
            {
               currentNode = null;
               return null;
            }
            currentNode = currentNode.getNext();
        }
        return null;
    }

2 个答案:

答案 0 :(得分:2)

您有一个包含节点的列表。每个节点都包含指向下一个节点的指针。

要从列表中删除节点,您必须将上一个节点的下一个指针设置为null

如果你还有一个指向前一个元素的指针,这是微不足道的。类似的东西:

public Object removeLast()
{
    Node currentNode;
    currentNode = this.getHead();
    while(currentNode != null)
    {

        if(currentNode.getNext()==null)
        {
           // The line below is changed!!!
           currentNode.getPrevious().setNext(null);
           return null;
        }
        currentNode = currentNode.getNext();
    }
    return null;
}

如果每个节点中有一个指向下一个节点和前一节点的指针,那么我们将其称为双链表。


此外,返回类型不需要Object,您可以将方法签名更改为:

public void removeLast()

然后将每个return null;更改为return;

答案 1 :(得分:0)

您现在所做的是将您的虚拟节点设置为null,但这根本不会影响您的列表。我会尝试想象:

原始列表由节点组成,由下一个指针连接。局部变量currentnode指的是列表中的一个节点。下面,它指向最后一个元素。

head --<next>-> node --<next>-> node --<next>-> node --<next>-> null
                                                  ^
                                                  |
                                            currentnode

如果您现在currentnode = null,则会产生:

head --<next>-> node --<next>-> node --<next>-> node --<next>-> null


                                            currentnode --> null

请注意,这根本不会影响您的链接列表。


您想要做的是将一个但最后一个节点的--<next>->设置为null。为此,您应该在迭代列表时跟踪上一个节点:

if (getHead().getNext() == null) {
    setHead(null);
} else {
    Node previous = getHead();
    Node current = previous.getNext();

    while (current.getNext() != null) {
        previous = current;
        current = current.getNext();
    }

    previous.setNext(null);
}