在链接列表中反向打印
我想编写函数在Java中打印链接列表的反转。我这样写,但它不起作用。编译器警告NullPointerException
。在链接列表中反向打印
void ReversePrint(Node head) {
int[] array = null;
int i = 0;
Node tmp;
for (tmp = head; tmp != null; tmp = tmp.next) {
array[i] = tmp.data;
i++;
}
for(int j = i; j >= 0; j--){
System.out.println(array[j]);
}
}
你得到NullPointerException
因为变量array
是null
:
int[] array = null;
你需要你在这里使用它之前与价值首先初始化:
array[i] = tmp.data;
例如像这样的陈述:
int[] array = new int[size];
其中size
应该是您的LinkedList
的大小。如果你不知道尺寸,你可以使用ArrayList
类,它实现了动态尺寸(它猜测一个尺寸,如果你超过它,它会重新分配一个更大的数组,并复制所有内容结束等等)。
下面是使用一个版本说ArrayList
:
// Method names should start with a lower-case letter
void reversePrint(Node head) {
// Initialize an empty ArrayList
ArrayList<Integer> dataList = new ArrayList<>();
int i = 0;
Node tmp;
for (tmp = head; tmp != null; tmp = tmp.next) {
// Set the element at position i of the ArrayList
dataList.set(i, tmp.data);
i++;
}
// See next comment
i--;
for(int j = i; j >= 0; j--){
// Get the element at position j of ArrayList and print it
System.out.println(dataList.get(j));
}
}
注意,你也会遇到IndexOutOfBoundException
,因为你i
是1
以达到大印刷循环时。这是因为你在第一循环的最后一次迭代也增加了它:
// Suppose last iteration, i is (list.size() - 1) then
for (tmp = head; tmp != null; tmp = tmp.next) {
array[i] = tmp.data;
// i is now list.size()
i++;
}
你需要在环路初始化的环路之间的一个i--
或int j = i - 1
。
如果要实现双链接列表,而不是只单链接列表,则请注意,您不需要故事值数组第一。然后您可以直接从tail
和tmp.prev
指针开始打印值。
非常感谢你 –
要做到这一点,最简单的方法是使用递归方法:
void ReversePrint(Node node) {
if (node != null) {
ReversePrint(node.next);
System.out.println(node.data);
}
}
太棒了!谢谢 –
简单是的。但取决于可能很容易在'StackOverflowError'中出现的列表大小。正如OP的说明一样。 – Zabuza
所以我不应该使用这段代码,如果列表的大小很大,那么@Zabuza –
在代码中,'array'没有初始化,这是'null'。 – Berger
但我尝试通过int [] array = {0}修复; –
而且这不起作用。 –