解题思路:在不改变链表本身结构的情况下,正常情况下遍历链表肯定是从头结点开始,直到最后一个结点。而现在需要从尾到头输出这个链表,这样满足后访问的结点先打印,类似于栈的后进先出特点,因此考虑利用栈这种数据结构,在遍历的同时将结点入栈。遍历结束后,将栈顶元素出栈,保存到arraylist中,直到栈空。
class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public class Solution { /** * 解题思路:在保证不改变原有链表的基础上,利用栈来实现 从头到尾遍历链表,先遍历的节点先入栈,栈的特点是后进先出 * 因此待链表遍历结束时,将栈中元素出栈即可实现从尾到头打印链表 * * @param listNode * @return */ public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> arrayList = new ArrayList<Integer>(); if (listNode == null) { return arrayList; } // 初始化一个栈用于保存遍历到的节点 Stack<ListNode> stack = new Stack<ListNode>(); ListNode p = listNode; // 从头到尾遍历链表 while (p != null) { // 将当前p所指向节点入栈 stack.push(p); // p后移一位 p = p.next; } // 将栈中所有元素出栈 while (!stack.isEmpty()) { ListNode node = stack.pop(); arrayList.add(node.val); } return arrayList; }