剑指offer3-从尾到头打印链表
1、题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
2、思路分析
从头到尾打印链表比较简单,从尾到头很自然的可以想到先将链表进行反转,然后再打印。但是,通常我们不希望改变原链表的结构,这是一个只读操作。
因此,我们进一步分析,可以发现排在后面的先输出,这是一个典型的“后入先出”的思想,因此很自然的可以想到用栈来实现,每遍历一个结点,可以将其压入栈中,遍历结束后再逐个弹栈,将结点值存入ArrayList,这样就实现了从尾到头的打印。
更进一步,既然想到了用栈,那一定可以通过递归来实现。每访问到一个结点,先递归输出其后的结点,在输出该结点自身即可。
3、代码
package com.jianzhioffer;
import java.util.Stack;
public class offer_03 {
public static class ListNode {
int val; // 结点的值
ListNode next; // 下一个结点
}
/**
* 方法一:借助栈的后入先出实现
* @author : 作者名称
* @date : 2020-03-12 17:59
* @param root :
* @return : void
*/
public static void printListFromTailToHead(ListNode root) {
Stack<ListNode> stack=new Stack<>();
while (root!=null) {
stack.push(root);
root=root.next;
}
ListNode tmp;
while(!stack.isEmpty()) {
tmp=stack.pop();
System.out.print(tmp.val+ " ");
}
}
/**
* 递归实现
* @author : 作者名称
* @date : 2020-03-12 18:01
* @param root :
* @return : void
*/
public static void printListInverselyUsingRecursion(ListNode root) {
if (root != null) {
printListInverselyUsingRecursion(root.next); //先递归输出其后的结点
System.out.print(root.val + " ");//再输出自身
}
}
public static void main(String[] args) {
ListNode root = new ListNode();
root.val = 1;
root.next = new ListNode();
root.next.val = 2;
root.next.next = new ListNode();
root.next.next.val = 3;
root.next.next.next = new ListNode();
root.next.next.next.val = 4;
root.next.next.next.next = new ListNode();
root.next.next.next.next.val = 5;
printListFromTailToHead(root);
System.out.println("\n");
printListInverselyUsingRecursion(root);
}
}