【问题标题】:Java remove an element from linked list recursionJava从链表递归中删除一个元素
【发布时间】:2014-05-02 15:51:35
【问题描述】:

对于分配给我的这个任务,我应该以迭代和递归的方式遍历大小为 1,000,000 的链表。我有迭代部分,但我对递归部分感到困惑。我有这个概念,但我告诉我的老师我不能递归地这样做,因为我不可避免地会遇到堆栈溢出错误。他说我不应该遇到这个问题,但我完全被困住了。任何提示都会很棒,因为我不知道我做错了什么。

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);
    }
}

}

【问题讨论】:

  • 这段代码你得到了什么?您的确切问题是什么?

标签: java recursion data-structures linked-list stack-overflow


【解决方案1】:

这并不难理解。当你运行你的程序时,堆栈区域不够,所以你有一个错误。

你可以尝试增加栈的空间。

使用以下参数运行程序:

-Xss1280m

意思是创建1280MB的栈,你会看到这样的结果:


【讨论】:

  • 我将如何使用这些参数运行我的程序?是否可以在我的代码中创建该语句,以便它会自动为运行程序的任何人分配更大的堆栈区域?
  • 可以先编译java文件,代码javac Main.java,运行代码:java -Xss1280m Main。而且我写了shell脚本来运行程序,而不是直接运行。这里是我的脚本:java -Xss1280m Main,我只是用sh run.sh运行,它可以工作。如果你在windows中,你也可以编写.bat文件。
  • 好的,我明白了,但是有没有办法在我的 .java 文件中写入来创建一个 1280MB 的堆栈?
  • 我不确定是否有任何方法可以做到这一点。但到目前为止我看到的是一个带有配置文件的脚本。
  • @Arkant0r:我认为不可能从 java 源代码中指定堆栈大小,因为这会带来安全风险。
【解决方案2】:

在迭代版本中,你应该在remove时传入索引。

randomList.remove(i);

在调用递归方法之前,你不应该也重新填充链表吗?

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

不太确定链表的 Java 实现。试着在上面看。有 isEmpty() 方法吗? 或者你应该试试:

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

【讨论】:

  • 你说得对,我忘了重新填充列表!一旦我尝试了,让我回复你。
  • 好吧,我重新填充了列表并在 remove 语句中传递了索引,但是当我创建一个包含 1,000,000 个整数的链表然后使用递归函数时,我仍然收到 stackoverflow 错误。
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多