我删除了最后一个函数,它似乎应该可以工作,但是当我调用它时,实际上并没有删除任何东西,所有节点仍然存在。
它有什么问题吗?
public Object removeLast()
{
Node currentNode;
currentNode = this.getHead();
while(currentNode != null)
{
if(currentNode.getNext()==null)
{
currentNode = null;
return null;
}
currentNode = currentNode.getNext();
}
return null;
}
答案 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);
}