剑指Offter——从尾到头打印链表

677 阅读1分钟

题目:从尾到头打印链表

输入一个链表的头节点,从尾到头反过来打印每个节点的值。

解题思路

思路一:

一般情况下,遇到这个问题首先想到的是将整个链表反转过来,然后打印。这样一般是不行的,打印首先是一个只读操作,不希望进行修改内容,也不希望改变链表的结构。打印每个节点的值,这肯定需要遍历每一个节点的,遍历操作不能缺少。从尾到头打印?这让我们想到另外一种数据——栈,栈的数据结构的特点:先入后出。这道题就迎刃而解。

解题代码


  java.util.ArrayList<Object> printListFromTailToHead(ListNode listModel) {
        Stack<Object> stack = new Stack<>();
        while (listModel != null) {  // 入栈操作
            stack.add(listModel.val);
            listModel = listModel.next;
        }
        java.util.ArrayList<Object> list = new java.util.ArrayList();
        while (!stack.isEmpty()) {
            // 出栈
            list.add(stack.pop());
        }

        return list;
    }

    class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }

思路二:

既然想到使用栈来实现这个函数,那么也可以使用递归来实现,因为递归在本质上就是一个栈结构。要实现反过来输出链表,每放到一个节点的时候,先递归输出它后面的节点,再输出该节点本身。

解题代码


    ArrayList printListFromTailToHead(ListNode listNode) {
        ArrayList<Object> objects = new ArrayList<>();
        if (listNode != null) {
            objects.addAll(printListFromTailToHead(listNode.next));
            objects.add(listNode.val);
        }
        return objects;
    }

    class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }

源码链接

后记

摘自《剑指Offter》