在链接列表中反向打印

问题描述:

我想编写函数在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]); 
    } 
} 
+2

在代码中,'array'没有初始化,这是'null'。 – Berger

+0

但我尝试通过int [] array = {0}修复; –

+0

而且这不起作用。 –

你得到NullPointerException因为变量arraynull

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,因为你i1以达到大印刷循环时。这是因为你在第一循环的最后一次迭代也增加了它:

// 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


如果要实现双链接列表,而不是只单链接列表,则请注意,您不需要故事值数组第一。然后您可以直接从tailtmp.prev指针开始打印值。

+0

非常感谢你 –

要做到这一点,最简单的方法是使用递归方法:

void ReversePrint(Node node) { 
    if (node != null) { 
     ReversePrint(node.next); 
     System.out.println(node.data); 
    } 
} 
+0

太棒了!谢谢 –

+0

简单是的。但取决于可能很容易在'*Error'中出现的列表大小。正如OP的说明一样。 – Zabuza

+0

所以我不应该使用这段代码,如果列表的大小很大,那么@Zabuza –