我正试图为链表添加方法,但由于某种原因(这对我来说并不明显,事实上我来这里是为了帮助找到错误),它每次都会进入无限循环。
编辑:我发现了错误,我将保留我的原始代码,并附上更正后的代码的注释public void insert(String majorName)
{
MajorNode newNode = new MajorNode(majorName, 1);
boolean inList = false;
MajorNode current = first;
if(isEmpty())
{
first = newNode;
// inList = true;
}
else
{
while(current.next != null)
{
if(current.majorName.equalsIgnoreCase(majorName))
{
current.frequency++;
inList = true;
break;
}
else
{
current = current.next;
}
}
}
if(!inList)
{
newNode.next = first;
first = newNode;
}
}
如果需要的话,这里是我的节点类:
public class MajorNode
{
public String majorName;
public int frequency;
public MajorNode next;
public MajorNode(String majorName, int frequency)
{
this.majorName = majorName;
this.frequency = frequency;
}
public String toString()
{
return majorName + " " + frequency;
}
}
在第一次调用insert()
时,假设isEmpty()
返回true,因此first
被设置为newNode
,而newNode
的next
字段被设置为first
的前一个(空)值。因此,当列表非空时,循环无限迭代列表中next
字段指向自身的最后一个元素。
出于好奇,为什么您要尝试实现自己的链表功能,而不是构建在可用的包(如java.util.LinkedList
创建第一个节点时:
if(!inList)
{
newNode.next = first;
first = newNode;
}
这将第一个节点指向自己…因此一个循环
您应该离开newNode。Next为第一个节点的null,这样当您插入第二个项时,您将到达链的末端。
如果您添加的节点与List的最后一个节点相似,则会有错误的频率。考虑这种情况(在空列表中添加2个类似的节点)
- 您将在空白列表中添加node1。首先&Current将指向node1。(但node1。下一个将为null)
- 如果您添加相同的节点(或具有相同
majorName
的节点),您将到达while循环(因为List现在不是空的)。而且,你也不会进入while循环。(作为你的电流。Next仍然为空)你最终会在你的列表中有两个相同的majorName
。
我建议使用
while(current != null)
不是while(current.next != null)