2011-05-04 127 views
1

我想为链表创建一个添加方法,但出于某种原因(对我来说这并不明显,实际上我来这里是为了帮助查找错误)每次都会进入无限循环。为什么会无限循环? (Java)

编辑:我发现了错误,我会继续我的原代码的注释与该修正的代码

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

没有我唯一的问题是,这是否更新每个项目的频率是否正确?谢谢大家。 – Brendan 2011-05-04 23:04:14

+0

你100%确定你的列表没有在某个地方得到一个循环? – 2011-05-04 23:23:26

回答

3

在第一次调用insert(),一个假设isEmpty()返回true,因此first设置为newNode,然后newNodenext字段被设置为前一个(空)值first。因此,当列表非空时,循环会无限期地迭代列表中最后一个元素,其next字段指向自身。

出于好奇,你为什么试图实现自己的链表功能,而不是建立在可用的包上(如java.util.LinkedList<E>)?

+0

对于算法类,我只是想将其作为我的最终项目的一部分,如果它已经存在于列表中,我的插入方法不能将新对象插入列表中。它应该只是增加该项目的频率。 – Brendan 2011-05-05 00:08:35

+0

没问题;但也许那么它应该被标记为家庭作业,因为在大多数现实世界的情况下这样的方法是不明智的?要回答您的修改后的问题,我相信修正的代码应该确实保持一个频率计数。 – eggyal 2011-05-05 00:12:16

+0

出于好奇,这不会是很好的生产代码,因为它使用自制的数据结构?或者它只是糟糕的编码?谢谢你的帮助。 – Brendan 2011-05-05 00:46:05

2

当你创建第一个节点,你这样做:

if(!inList) 
{   
    newNode.next = first;   
    first = newNode;  
} 

这点指向第一个节点下一个本身...因此一个循环

你应该离开newNode.next为空的第一个节点,这样,当你插入第二个项目,你到达链的末端..

1

如果您添加一个类似于列表的最后一个节点的节点,则会出现错误的频率。考虑这种情况(在空列表中添加2个相似的节点)

  1. 您将在空白列表中添加一个node1。所以第一个&电流将指向node1。 (但node1.next将为空)
  2. 如果添加相同的节点(或具有相同的majorName的节点),则会到达while循环(因为List现在不是空的)。而且,你也不会进入while循环。 (因为你的current.next仍然是空的) ,你最终会在你的列表中有两个不同的majorName

我会建议使用的

while(current != null) 

代替

while(current.next != null) 
+0

不错的地方。还有一个想法:当向列表中插入一个新节点时,频率不会增加/设置。 – eggyal 2011-05-08 06:18:04

+0

@eggyal,我很抱歉,但是我并没有在向list_插入新节点时增加/设置_频率。我认为频率是作为构造参数传递的,并且不需要为新节点明确设置。如果我错了,请纠正我。 – 2011-05-08 11:50:58

+0

唉,挺对的!抱歉。 – eggyal 2011-05-09 08:25:38