代码的工作原理是我的讲师交给我的,我不会看到他四个星期我没有人去做这件事。 我需要了解它是如何工作的,以及代码的一部分。
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和调试模式运行它,你会看到我的意思。
答案 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"
)