剑指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;
	}
}

  

posted @ 2015-10-08 21:05  做个有梦想的咸鱼  阅读(315)  评论(0编辑  收藏  举报