好的,所以我需要从循环列表中删除项目,这是一个较大的程序的一部分,该程序无法正常工作,而且我似乎无法删除传入删除方法的最后一个节点,如果传入的索引为1,它将删除第一个节点列表中的节点并替换它,但是当此时仅剩一个节点时,没有什么可引用的。我将在此处保留删除方法
public void delete(int index)
{
if(Node.numOfUsers == 1)
{
first=null;
return;
}
//make curr the same as first node
int i = 1;
curr=first;
//if index passed in is 1, make temporary node same as one after first node
// if(size<1)
// {
// System.out.println("ok so this is where we are at");
// }
if(index==1)
{
temp=first.nextNode;
while(temp.nextNode!=first)
{
temp=temp.nextNode;
}
temp.nextNode=temp.nextNode.nextNode;
first=curr.nextNode;
}
else
{
//as long as i is not equal to node index-1 move current on 1 and increment i by 1
while(i != index-1)
{
curr=curr.nextNode;
i++;
}
//curr.nextNode is pointing to the node index we want and making it equal to one index above it
curr.nextNode=curr.nextNode.nextNode;
}
Node.numOfUsers--;
int size=size();
}
}
最佳答案
看起来您正在全局跟踪许多用户。如果它的行为符合我的预期,则可以在此方法的开头进行一次小检查,以便在该方法为零的情况下不会遵循其后的任何逻辑。
if(Node.numOfUsers == 0) return;
这将使您不必再执行任何其他逻辑。
解决此问题的更好方法是将要删除的Node用作参数,而不是其索引。这样,您可以避免必须跟踪数据结构内的索引。
例如
public void delete(Node n) {
if(Node.numOfUsers == 0 || n == null) return; // 0 nodes or null parameter.
Node temp = first;
if(temp.next == null) { //only one node
temp = null; //simply delete it
} else {
while(temp.next != n) {
temp = temp.next;
if(temp == first) { //if we circle the entire list and don't find n, it doesn't exist.
return;
}
}
temp.next = n.next; // perform the switch, deleting n
}
}
编辑:上面的代码遵循以下假设,即您将具有对要删除的节点的引用。如果不是这种情况,那么使用索引也一样。您也可以考虑比较值,但是这将要求您假设节点中具有唯一值(并且我不知道您的限制是什么)。
比较值的逻辑与上述相同,但是例如,您可以比较
if(temp == n)
而不是比较if(temp.data.equals(n.data))
。 .equals()
方法的使用专门用于String
类型,但是您可以对其进行修改以使其与所需的任何数据类型一起使用,或者更好地编写一个自定义的.equals
方法,该方法允许将泛型用于您的抽象数据类型。