我正在尝试为链表创建一个add方法,但由于某些原因(这对我来说并不明显,实际上我来这里是为了找到错误的帮助)它每次进入一个无限循环。 / p>
编辑:我发现了错误,我将保留原始代码并附带更正后代码的评论
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;
}
}
答案 0 :(得分:3)
在第一次调用insert()
时,会假设isEmpty()
返回true,因此first
设置为newNode
newNode
之前的next
first
}}字段设置为next
的上一个(null)值。因此,当列表非空时,循环将无限期地迭代列表中{{1}}字段指向其自身的最后一个元素。
出于好奇,您为什么要尝试实现自己的链接列表功能而不是基于可用的包(例如java.util.LinkedList<E>)?
答案 1 :(得分:2)
创建第一个节点时,请执行以下操作:
if(!inList)
{
newNode.next = first;
first = newNode;
}
这指向下一个第一个节点......因此是一个循环
您应该将newNode.next保留为第一个节点的null,这样当您插入第二个项目时,就会到达链的末尾。
答案 2 :(得分:1)
如果添加的节点类似于列表的最后一个节点,则频率将会错误。考虑这种情况(在空列表中添加2个类似的节点)
majorName
的节点),您将进入while循环(因为List现在不为空)。而且,你也不会进入while循环。 (因为你的current.next仍为null)
并且您最终会在列表中显示两个相同majorName
的noes。我建议使用
while(current != null)
而不是
while(current.next != null)