剑指offer第二版——面试题6(java)

面试题6:从尾到头打印链表

题目:

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

链表的结点定义如下

public class ListNode {
   int      val;
   ListNode next;
   ListNode(int x) { val = x; }
}

注意

面试中,如果打算修改输入的数据,最好先问好是否数据是允许修改的

思路

1. 遍历顺序从头到尾,打印顺序从尾到头,第一个结点最开始被访问,但是最后才被输出——栈的“先进后出”;

扫描二维码关注公众号,回复: 5462203 查看本文章

2. 递归在本质上就是一个栈结构,所以也可以用递归实现:先递归输出它后面的结点,再输出该结点自身。 【问题:当链表非常长的时候,会导致函数调用的层级很深,从而有可能导致函数调用栈溢出,因此还是用栈基于循环实现的代码鲁棒性好一些】

// 栈实现
class Q6 {
	public static void main(String[] args) {
		// 后插法创建链表 0 9 8 7 …… 1
		ListNode head = new ListNode(0);
		for(int i=1;i<10;i++) {
			head.addNode(head, i);
		}
		// 只有头结点的链表
		ListNode head1 = new ListNode(0);
		
		// 空链表
		ListNode head2 = null;
		
		// 依次显示当前链表
		head.showList(head1);
		System.out.println("\n----");
		showReverse(head1);
	}  
	
	public static void showReverse(ListNode node) {
		Stack<Integer> stack = new Stack<Integer>();
		// 压栈
		while(node!=null) {
			int temp = node.val;
			stack.push(temp);
			node = node.next;
		}
		// 出栈
		while(!stack.empty()) {
			int temp = stack.pop();
			System.out.printf("%d ",temp);
		}
	}
// 递归
class test {
	public static void main(String[] args) {
		// 后插法创建链表 0 9 8 7 …… 1
		ListNode head = new ListNode(0);
		for(int i=1;i<10;i++) {
			head.addNode(head, i);
		}
		// 只有头结点的链表
		ListNode head1 = new ListNode(0);
		
		// 空链表
		ListNode head2 = null;
		
		// 依次显示当前链表
		head.showList(head);
		System.out.println("\n----");
		showReverse(head);
	}  
	
	public static void showReverse(ListNode node) {
		if(node!=null) {
			if(node.next!=null) {
				showReverse(node.next);
			}  // 之前在这里加了个else就只输出了最后一个_(:з」∠)_ 
				System.out.printf("%d ", node.val);
		}
}

猜你喜欢

转载自blog.csdn.net/qq_22527013/article/details/88339521