2014-03-25 43 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