题目:输入一个链表的头节点,从尾到头反过来打印出每个节点的值。链表节点定义如下:

private static class ListNode {
private int value;
private ListNode next;
public ListNode(int value) {
this.value = value;
}
}

如果只是反过来打印节点的值,那么很简单,只要遍历链表,将节点的值 push 到一个栈里面,因为栈的特点是后进先出,所以最后我们遍历栈,达到的效果就是将链表从尾到头打印,如下

public static void printListReverse(ListNode root) {
if (root == null) {
return;
}

Stack<Integer> stack = new Stack<>();
ListNode cur = root;
// 遍历链表 将值添加到栈中
while (cur != null) {
stack.push(cur.value);
cur = cur.next;
}
// 遍历栈 打印栈头的值
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}

另外一种方法就是使用递归,对于任意一个节点,反过来打印即先打印下一个节点,然后在打印当前节点,如下

public static void printListReverse2(ListNode root) {
// 既是递归退出的条件 也是对传入的链表进行检查
if (root == null) {
return;
}
printListReverse2(root.next);
System.out.println(root.value);
}