面试题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);
}
}