我在循环链表的删除方法时遇到问题。它只执行 if 语句。我做错了什么?如何解决此问题?在循环链表中,您只需要跟踪指向最后一个
元素的第一个元素public void remove()
{
Node currNode = first;
Node prevNode = null;
if(first != null)
{
if(currNode.getNext() == first)
{
first = null;
}
}
else
{
prevNode = currNode;
currNode = currNode.getNext();
}
}
class Node
{
private int data;
private Node next;
public Node(int data, Node next) {
this.data = data;
this.next = next;
}
public int getData() {
return data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
Node currNode = first;
Node prevNode = null;
是局部变量,所以在函数 remove() 之后,它们被删除了,你没有存储这个值。每次调用 remove() 时,currNode 和 prevNode 中都有一些值。所以你应该把这个变量用作类变量:
...
Node currNode = first;
Node prevNode = null;
public void remove()
{
if(first != null)
{
if(currNode.getNext() == first)
{
first = null;
}
}
else
{
prevNode = currNode;
currNode = currNode.getNext();
}
}
或者你应该使用currNode.setNext(...) instead of currNode = ...
我将做出某些假设,因为我无法发表评论
-您使用第一个节点访问循环链表,这意味着如果第一个节点不为空,则循环链表不为空
-其次,仅当链表为非空时,您才调用 remove() 函数,因此根据我的第一个假设,您无法访问 else 块。
你的 remove() 逻辑不清楚。
如果你在 first!=null 或非空的链表时调用 remove(),你正在检查第二个节点是否相同是第一个,然后删除对 first(first=null) 的引用意味着你丢失了链表,而不将第二个节点分配给新的 first(node)。对我来说,看起来您删除了整个链表,而不仅仅是第一个元素。
现在,如果您在空链表上调用 remove() 函数,即 first=null
currNode= first //currNode = null
所以 else 块将如下所示
prevNode=null;
currNode=null.getNext() //Null pointer Exception!!
最后我检查了循环链表,最后一个节点的下一个应该指向第一个节点,而不是第一个指向最后一个节点。
PS-如果我的任何假设是错误的,请发表评论而不是投反对票:)