为什么这会无限循环? (JAVA)

时间:2011-05-04 23:02:11

标签: java insert linked-list infinite-loop

我正在尝试为链表创建一个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;
    }
}

3 个答案:

答案 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个类似的节点)

  1. 您将在空白列表中添加node1。首先是&amp; current将指向node1。 (但node1.next将为null)
  2. 如果添加相同的节点(或具有相同majorName的节点),您将进入while循环(因为List现在不为空)。而且,你也不会进入while循环。 (因为你的current.next仍为null) 并且您最终会在列表中显示两个相同majorName的noes。
  3. 我建议使用

    while(current != null)
    

    而不是

    while(current.next != null)