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

    1. private static class ListNode {
    2. private int value;
    3. private ListNode next;
    4. public ListNode(int value) {
    5. this.value = value;
    6. }
    7. }

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

    1. public static void printListReverse(ListNode root) {
    2. if (root == null) {
    3. return;
    4. }
    5. Stack<Integer> stack = new Stack<>();
    6. ListNode cur = root;
    7. // 遍历链表 将值添加到栈中
    8. while (cur != null) {
    9. stack.push(cur.value);
    10. cur = cur.next;
    11. }
    12. // 遍历栈 打印栈头的值
    13. while (!stack.isEmpty()) {
    14. System.out.println(stack.pop());
    15. }
    16. }

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

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