题目:
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
思路:
方案一:(后进先出)遍历链表,再从栈顶开始出个输出结点的值,此时输出的结点的顺序已经反转过来了。
1、先推进栈
2、再依次取出栈顶元素
方案二:递归。
1、判断链表头结点是否为空
2、将 next 结点作为下一次的实参
3、输出当前栈顶元素
缺点:当链表非常长的时候,会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。
代码:
package 从尾到头打印链表05;
import java.util.Stack;
public class Demo {
/**
* 结点对象
* @author Administrator
*/
public static class ListNode {
int val; // 结点的值
ListNode nxt; // 下一个结点
}
/**
* 输入一个链表的头结点,从尾到头返货来打印每个结点的值
* 使用栈的方式进行(先进后出)
* @param root 链表头结点
*/
public static void printListInverselyUsingIteration(ListNode root) {
// Stack:栈,特性是:先进后出(FILO, First In Last Out)。
// Stack也是通过数组实现的,而非链表
Stack<ListNode> stack = new Stack<>();
while (root != null) { // 链表头结点不为空
stack.push(root); // 头结点推入栈中
root = root.nxt; // 下一节点变为头结点,作为下一次的实参
}
ListNode tmp;
while (!stack.isEmpty()) { // 栈不为空
tmp = stack.pop(); // 取出栈顶元素,赋予 tmp
System.out.println(tmp.val); // 输出栈顶元素
}
}
/**
* 递归
* 输入个链表的头结点,从尾到头反过来打印出每个结点的值
* 使用栈的方式进行
* @param root 链表头结点
*/
public static void printListInverselyUsingRecursion(ListNode root) {
if (root != null) { // 链表头结点不为空
printListInverselyUsingRecursion(root.nxt); // 递归
System.out.println(root.val + " "); // 输出栈顶元素
}
}
public static void main(String[] args) {
ListNode root = new ListNode();
root.val = 1;
root.nxt = new ListNode();
root.nxt.val = 2;
root.nxt.nxt = new ListNode();
root.nxt.nxt.val = 3;
root.nxt.nxt.nxt = new ListNode();
root.nxt.nxt.nxt.val = 4;
root.nxt.nxt.nxt.nxt = new ListNode();
root.nxt.nxt.nxt.nxt.val = 5;
printListInverselyUsingIteration(root);
System.out.println();
printListInverselyUsingRecursion(root);
}
}