略
题目:输入一个链表,从尾到头打印链表每个节点的值。
分析
链表是一种动态的数据结构,创建链表时,无须知道链表的长度。当插入一个结点时,只需要为新的结点分配内存。然后调整指针的指向来确保新结点被链接到链表当中。题目中要求要从尾到头打印链表的每个结点的值,自然想到要去遍历链表,但是遍历的顺序是从头到尾的,可输出是从尾到头,由这可以想到用栈去实现这个顺序。遍历链表时,依次把结点值放到栈中,最后再从栈顶开始输出结点的值。
是否可以用其他的方法呢?答案是可以的,这里还可以用到一个递归的方法。要想打印这个结点,必须先打印该结点后面的一个结点。
代码实现
使用栈
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
import java.util.ArrayList; import java.util.Stack; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { Stack<Integer> stack=new Stack<Integer>(); while(listNode!=null){ stack.push(listNode.val); listNode=listNode.next; } ArrayList<Integer> list=new ArrayList<Integer>(); while(!stack.isEmpty()){ list.add(stack.pop()); } return list; } }
|
使用递归
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
import java.util.ArrayList; import java.util.Stack; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list=new ArrayList<Integer>(); ListNode pNode=listNode; if(pNode!=null){ if(pNode.next!=null){ list=printListFromTailToHead(pNode.next); } list.add(pNode.val); } return list; } }
|
总结
合理运用栈的机制,可以很容易的实现反转字符串.