剑指offer 面试题5 : 从尾到头打印链表
题目:
输入一个链表的头结点,从尾到头反过来打印出每个节点的值。链表结点定义如下:
struct ListNode { int m_nKey; ListNode* m_pNext; };
思路:
通常打印是一个只读操作,我们不希望打印时修改内容,所以这个题目在遍历过程中,不能修改链表的值。逆序打印链表,操作正好符合堆栈的数据结果。
Java代码实现:
import java.util.ArrayList; import java.util.Stack; public class Solution { public static void main(String[] args) { ListNode listNode = new ListNode(1); ListNode root = listNode; for (int i = 2; i < 5; i++) { listNode.next = new ListNode(i); listNode = listNode.next; } new Solution().printListFromTailToHead(root); new Solution().printListFromTailToHead2(root); } /** * 非递归实现,借助于栈的数据结构 * * @param listNode * @return */ public void printListFromTailToHead(ListNode listNode) { Stack<Integer> stack = new Stack<Integer>(); ListNode root = listNode; while (root != null) { stack.push(root.val); root = root.next; } while (!stack.empty()) { System.out.print(stack.pop() + " "); } System.out.println(""); } /** * 递归实现方式 * * @param listNode * @return */ public void printListFromTailToHead2(ListNode listNode) { if (listNode != null) { if (listNode.next != null) { printListFromTailToHead2(listNode.next); } System.out.print(listNode.val + " "); } } } class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }
加油