2011-05-04 186 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