2014-03-25 44 views
3

對於賦予給我的這個賦值,我應該迭代並遞歸地遍歷一個大小爲1,000,000的鏈表。我有迭代的部分,但我對遞歸部分感到困惑。我有這個概念,但我告訴我的老師,我不能遞歸地這樣做,因爲我不可避免地會遇到堆棧溢出錯誤。他說我不應該得到這個問題,但我完全陷入困境。任何提示都會很棒,因爲我不知道我做錯了什麼。Java從鏈表遞歸中刪除一個元素

public static void main(String[] args) { 

    System.out.println("Please enter how many random numbers you want to generate: "); 
    Scanner prompt = new Scanner(System.in); 
    int amount = prompt.nextInt(); 

    Random rnd = new Random(); 
    System.out.println("Creating list..."); 
    for (int i = 0; i < amount; i++) { 
     randomList.add(rnd.nextInt(100)); 
    } 
    System.out.println("Going through list..."); 
    iterateNumbers(); 

    long startTimeRec = System.nanoTime(); 
    recursiveNumbers(randomList); 
    long elapsedTimeRec = System.nanoTime() - startTimeRec; 
    double seconds = (double)elapsedTimeRec/1000000000.0; 
    System.out.println("Recursively, the function took " + seconds + " seconds."); 

    prompt.close(); 

} 
//create the linked list 
public static LinkedList<Integer> randomList = new LinkedList<Integer>(); 

private static void iterateNumbers() { 

    long startTime = System.nanoTime(); 
    for (int i = 0; i < randomList.size(); i++) { 
     randomList.remove(); 
    } 
    long elapsedTime = System.nanoTime() - startTime; 
    double seconds = (double)elapsedTime/1000000000.0; 
    System.out.println("Iteratively, the function took " + seconds + " seconds."); 
} 

private static void recursiveNumbers(LinkedList<Integer> current) {  

    if (current.isEmpty() == true) { 
     return; 
    } else { 
     current.removeFirst(); 
     recursiveNumbers(current); 
    } 
} 

} 
+0

你用這個c得到了什麼頌?你確切的問題是什麼? – innoSPG

回答

1

這不是很難理解。當你運行你的程序時,堆棧區不夠用,所以你有一個錯誤。

您可以嘗試添加堆棧的空間。

帶下列參數運行程序:

-Xss1280m

這意味着創建1280MB的堆棧,你會看到的結果是這樣的:


enter image description here

+1

我將如何去用這些參數來運行我的程序?是否有可能在我的代碼中創建該語句,以便爲運行該程序的任何人自動分配更大的堆棧區域? – Arkant0r

+1

你可以先用代碼'javac Main.java'編譯java文件,然後運行代碼:'java -Xss1280m Main'.然後我編寫shell腳本來運行程序,而不是直接運行它。這裏是我的腳本:'java -Xss1280m Main',我只是用'sh run.sh'運行,它可以工作。如果你在windows中,你也可以編寫.bat文件。 –

+0

好吧我陷入困境,但是有沒有什麼辦法可以在我的.java文件中創建1280MB的堆棧? – Arkant0r

1

在迭代版本中,您應該在remove處傳入索引。

randomList.remove(i); 

而且您應該在調用遞歸方法之前不重新填充鏈表嗎?

for (int i = 0; i < amount; i++) { 
    randomList.add(rnd.nextInt(100)); 
} 

不太確定鏈接列表的Java實現。試圖在那裏看。有沒有一個isEmpty()方法? 或者你應該嘗試:

if(current.size() < 1) 
    return; 
+0

你是對的我忘了重新填寫名單!一旦我嘗試了,讓我回到你身邊。 – Arkant0r

+0

嗯,我重新填充了列表並在remove語句處傳遞了索引,但是當我創建一個具有1,000,000個整數的鏈表時,我仍然遇到了stackoverflowerror,然後使用遞歸函數。 – Arkant0r