题目描述
输入一个链表,从尾到头打印链表每个节点的值。
分析:方法一:首先想到的是递归的方式,将链表遍历后存入栈中,然后从栈中取出。
方法二:递归的本质就是一个栈结构,所以也可以使用递归来实现,要实现反过来输出链表,我们每访问一个节点的时候,先递归遍历它后面的节点,再输出该节点自身,这样输出的就是链表的反转的结果。
方法一代码实现:
public class Solution{
public ArrayList<Integer> printListFromTailToHead(ListNode listNode){
ArrayList<Integer> list = new ArrayList<>();
Stack<Integer> stack = new Stack<>();
if(listNode==null)
return list;
while(listNode!=null){
stack.push(listNode.val); //先从如栈中
listNode = listNode.next;
}
while(!stack.isEmpty()){
list.add(stack.pop()); //从栈中取出,此时是链表的反序的输出
}
return list;
}
}
方法二的代码实现:
public class Solution {
ArrayList<Integer> list = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode==null)
return list;
printListFromTailToHead(listNode.next);
list.add(listNode.val);
return list;
}
}
说明:过程简要说明:链表的第一个节点不为空,执行printListFromTailToHead(list.next),而并没有添加链表,当执行到最后一个节点时,此时执行printListFromTailToHead(list.next)函数中的list.next为null,然后这时才开始执行list.add(listNode.val)添加元素(此时是最后一个元素)进列表,执行完后添加倒数第二个元素,然后添加倒数第三个元素,直到添加完第一个元素后返回。
参考:剑指Offer