题目:从尾到头打印链表
输入一个链表的头节点,从尾到头反过来打印每个节点的值。
解题思路
思路一:
一般情况下,遇到这个问题首先想到的是将整个链表反转过来,然后打印。这样一般是不行的,打印首先是一个只读操作,不希望进行修改内容,也不希望改变链表的结构。打印每个节点的值,这肯定需要遍历每一个节点的,遍历操作不能缺少。从尾到头打印?这让我们想到另外一种数据——栈,栈的数据结构的特点:先入后出。这道题就迎刃而解。
解题代码
java.util.ArrayList<Object> printListFromTailToHead(ListNode listModel) {
Stack<Object> stack = new Stack<>();
while (listModel != null) { // 入栈操作
stack.add(listModel.val);
listModel = listModel.next;
}
java.util.ArrayList<Object> list = new java.util.ArrayList();
while (!stack.isEmpty()) {
// 出栈
list.add(stack.pop());
}
return list;
}
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
思路二:
既然想到使用栈来实现这个函数,那么也可以使用递归来实现,因为递归在本质上就是一个栈结构。要实现反过来输出链表,每放到一个节点的时候,先递归输出它后面的节点,再输出该节点本身。
解题代码
ArrayList printListFromTailToHead(ListNode listNode) {
ArrayList<Object> objects = new ArrayList<>();
if (listNode != null) {
objects.addAll(printListFromTailToHead(listNode.next));
objects.add(listNode.val);
}
return objects;
}
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
后记
摘自《剑指Offter》