Java循环链表,移除节点不正常
Java Circular Linked List,Remove Node not working properly
好的,所以我需要从循环列表中删除项目,作为无法运行的更大程序的一部分,如果传入的索引为 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;
这将使您不必费心执行任何其他逻辑。
解决此问题的稍微好一点的方法可能是使用要删除的节点作为参数,而不是其索引。这样您就可以避免跟踪数据结构中的索引。
例如
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
方法,允许将泛型用于抽象数据类型。
好的,所以我需要从循环列表中删除项目,作为无法运行的更大程序的一部分,如果传入的索引为 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;
这将使您不必费心执行任何其他逻辑。
解决此问题的稍微好一点的方法可能是使用要删除的节点作为参数,而不是其索引。这样您就可以避免跟踪数据结构中的索引。 例如
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
方法,允许将泛型用于抽象数据类型。