gpt4 book ai didi

Java循环链表,删除无法正常工作的节点

转载 作者:行者123 更新时间:2023-12-01 11:00:14 24 4
gpt4 key购买 nike

好吧,所以我需要从循环列表中删除项目,作为一个无法正常工作的更大程序的一部分,而且我似乎无法删除传入删除方法的最后一个节点,如果传入的索引是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.data.equals(),而不是比较 if(temp == n) n.数据)).equals() 方法的使用专门针对 String 类型,但您可以修改它以使用您期望的任何数据类型,或者更好地编写一个自定义 .equals 方法,允许对抽象数据类型使用泛型。

关于Java循环链表,删除无法正常工作的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33400155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com