扭转链接列表?

时间:2015-04-01 19:34:08

标签: java

代码的工作原理是我的讲师交给我的,我不会看到他四个星期我没有人去做这件事。 我需要了解它是如何工作的,以及代码的一部分。

import java.util.LinkedList;

public class Reverse {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    LinkedList<String> names = new LinkedList<String>();
    names.add("Ceri");
    names.add("Jesus");
    names.add("Abigail");

    Reverse(names);
}

public static void Reverse(LinkedList<String> list){

    System.out.println("->" + list);

    if(list.size() > 1){
        String s = list.removeLast();
        Reverse(list);
        list.addFirst(s);
    }
    System.out.println(list);
}

}

这一点准确无误:

   if(list.size() > 1){
        String s = list.removeLast();
        Reverse(list);
        list.addFirst(s);
    }
    System.out.println(list);
}

我进入调试模式以查看哪些行已执行,而list.addFirst(s)仅在list.size() > 1为假时执行,即使它位于for块中。 它也循环两次将 s “阿比盖尔”和“耶稣”分配给 s 但是当list.addFirst(s)运行时,就好像 s 就像一个阵列?

很难解释我的意思,如果你通过eclipse和调试模式运行它,你会看到我的意思。

3 个答案:

答案 0 :(得分:0)

该算法的本质是递归的。它表明(并且实现)列表的反向是:

If the list is longer than 1 entry (a 1-entry list is its own reverse)
1. Remove the last entry.
2. Reverse the remaining list.
3. Add the removed item onto the start of the list.

答案 1 :(得分:0)

它是一个递归函数。需要list.size()检查,因为您需要递归函数的基本案例。它确保如果列表中只有一个项目,那么就不要对它做任何事情。

基本上,它就像这样开始

Ceri, Jesus, Abigail

当调用Reverse功能时,它会看到有3个项目,所以它将Abigail存储在S中(让我们调用这个S1)注意该功能还没有完成,它会调用再次反转。

您的列表为Ceri, Jesus,您的S1为Abigail。这里调用Reverse,而S(我们称之为S2)现在是Jesus。此功能尚未完成,因为它必须调用Reverse。

列表现在只有Ceri,所以当它被调用时,它会停止(只有1个项目)。回到函数调用(从最近调用的第一个),你会看到S2被添加到列表的前面,所以现在列表看起来像

Jesus, Ceri

然后,添加S1。

Abigail, Jesus, Ceri。瞧!反向清单!

答案 2 :(得分:0)

Reverse方法是递归的(它调用自身),这似乎让你感到困惑。根据您的特定起始列表,该方法将递归两次,总共三次调用,每次调用都有自己独立的局部变量集。但是,list参数在每次递归时都会传递,因此尽管每个调用都有自己的变量副本,但它们都引用同一个对象。

以下是对所发生情况的细分:

  • 初次通话
    • list.size()最初为3。
    • 元素"Abigail"被移除并保存在本地变量s中(此堆栈框架)
    • 第一次递归
      • list.size()最初为2,一个元素已被删除
      • 元素"Jesus"被移除并保存在堆栈框架的本地变量s中;这与初始调用的框架
      • 中的变量不同
      • 第二次递归
        • list.size()最初为1,之前的Reverse()次调用已删除了一个元素(两者都尚未返回)
        • 未修改列表。 "Ceri"是此时唯一的要素。
      • 第二次递归返回
      • 此框架s"Jesus")已添加到列表的前面,以产生("Jesus""Ceri"
    • 第一次递归返回
    • 此框架s"Abigail")已添加到列表的前面,以产生("Abigail""Jesus""Ceri"