2012-04-27 32 views
-4

我得到一個股票溢出錯誤,當我運行我的代碼,我不知道是什麼問題。有人能幫我解決這個問題嗎?爪哇 - 創建一個訂單鏈接列表,不知道我是如何得到無限遞歸

這是給我的錯誤的方法。我非常肯定它與我以遞歸方式插入節點的方式有關,但我不知道我做錯了什麼。

這種方法的目的是爲了找到節點的鏈路中的正確位置,並插入新項目出現。節點需要保持升值。我希望這有助於更好地解釋目的。謝謝。

public class OrderedList< T extends Comparable<T> > { 

    private ListNode<T> firstNode; 
    private ListNode<T> lastNode; 
    private String name; // the name is used in printing 

    // constructor creates an empty ordered list with "ordered list" as the name 
    public OrderedList() { 
     this("ordered list");  
    } 

    // constructor creates an empty ordered list with a name 
    public OrderedList(String listName) {   
     name = listName; 
     firstNode = lastNode = null;  
    } 

    // insert an item into the right position of the ordered list 
    public void insert(T insertItem) {  
     if (isEmpty()) {   
      firstNode = lastNode = new ListNode<T>(insertItem);   
     }else {    
      if (insertItem.compareTo(firstNode.getData()) <= 0) {    
       firstNode = new ListNode<T>(insertItem, firstNode);    
      }else {     
       if (firstNode.equals(lastNode)) {      
        lastNode = new ListNode<T>(insertItem);     
       }else { 
        T store = firstNode.getData(); 
        firstNode = firstNode.getNext();     
        insert(insertItem);      
        firstNode.setNext(firstNode); 
        firstNode.setData(store); 
       } 
      }   
     } 
    } 

    public boolean isEmpty() { 
     return firstNode == null; 
    } 
} 
+5

幾乎遷移到元LOL – Starx 2012-04-27 22:05:18

+2

您還沒有給予足夠的信息,以確定爲什麼它不會繼續調用'插入()'不會觸發任何退出條件。即什麼是'isEmpty()',什麼是'firstNode'。 – 2012-04-27 22:06:56

+0

我沒有看到一個基本情況,它不會a)失去整個列表的跟蹤或b)有效地使用第一個/最後一個引用。人們會認爲,如果你有最後一個引用,那麼'insert()'只能應用*那裏* ...我不會downvote這個問題,雖然;您應該嘗試並嘗試解決問題,幷包括您嘗試解決問題的方法。 – Makoto 2012-04-27 22:09:32

回答

1

在過去else塊,你再打電話insert。所以這是一個遞歸函數,原則上遞歸函數容易受到棧溢出的影響。

如果你把一些println語句,和計數器,每個步驟,增量,可以看發生了什麼。

else {  
      T store = firstNode.getData();  
      firstNode = firstNode.getNext();  
      System.out.println ("depth: " + ++depth); 
      insert (insertItem);  
      --depth 
      firstNode.setNext (firstNode); 
      firstNode.setData (store);  
     } 

深度是用於調試目的的屬性或靜態變量。

相關問題