从尾到头打印链表(java)

来源:互联网 发布:photoshop cs4 mac 编辑:程序博客网 时间:2024/06/05 15:52

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

通常打印是一个只读操作,我们不希望打印时修改内容。

接下来我们想到解决这个问题肯定要遍历链表。遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头。也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出。这就是典型的“ 后进先出”,可以用栈实现这种顺序。每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。

package offer;import java.util.Stack;public class PrintListReverse {public static void main(String[] args) {ListNode node1 = new ListNode(1);ListNode node2 = new ListNode(2);ListNode node3 = new ListNode(3);node1.next = node2;node2.next = node3;printReverseList(node1);System.out.println();printReverseListRecursive(node1);}/** * 从尾到头打印链表 * @param root */public static void printReverseList(ListNode root){if(root==null) return;ListNode node = root;Stack<ListNode> stack = new Stack<ListNode>();while(node!=null){stack.push(node);node = node.next;}while(!stack.isEmpty()){int val = stack.pop().val;System.out.print(val+" ");}}/** * 递归写法 * @param root */public static void printReverseListRecursive(ListNode root){if(root==null) return;printReverseList(root.next);System.out.print(root.val+" ");}public static void printReverseListRecursive2(ListNode root){if(root!=null){if(root.next!=null){printReverseListRecursive2(root.next);}System.out.print(root.val+" ");}}}/*class ListNode{ListNode next;int val;}*/

既然想到了用栈实现这个函数,而递归在本质上就是一个栈结构,于是很自然地用想到了用递归来实现。要实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点本身。

0 0
原创粉丝点击