输入一个链表,从尾到头打印链表每个节点的值。
我一开始想到的是遍历这个链表,遍历过程中用一个ArrayList保存里面的值,然后再从尾到头遍历这个ArrayList,存储在新的ArrayList里面返回。
//使用另外一个ArrayList存储链表的方法 public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list=new ArrayList<Integer>(); ListNode head=listNode; while(head!=null) { list.add(head.val); head=head.next; } ArrayList<Integer> result=new ArrayList<Integer>(); for(int i=list.size()-1;i>=0;i--) { result.add(list.get(i)); } return result; }
后来看了剑指offer,发现其实如果是从尾到头打印链表,由于这个是单向链表,并没有存储前一个链表的值,所以我们只能先从头到尾打印链表,所谓的“后进先出”,这时候就可以联想到栈这个数据结构。
Stack类是Vector类的子类.Vector类与ArrayList类的区别是,Vector是线程安全的,即在多线程的情况下,允许多个线程同时修改vector,但ArrayList是线程不安全的,需要在代码里保证其同步性,即一次只能有一个线程访问ArrayList.所以Vector的性能是比ArrayList要低的。
public static ArrayList<Integer> printListFromTailToHeadWithStack(ListNode listNode) { Stack<Integer> stack = new Stack<Integer>(); ArrayList<Integer> list=new ArrayList<Integer>(); ListNode head=listNode; while(head!=null) { stack.push(head.val); head=head.next; } while(!stack.isEmpty()) { Integer item=stack.pop(); list.add(item); } return list; }
由栈又很容易联想到递归。
static ArrayList<Integer> result; public static void print(ListNode listNode) { if(listNode!=null) { print(listNode.next); result.add(listNode.val); } } //使用递归 public static ArrayList<Integer> printListFromTailToHeadWithRecursion(ListNode listNode) { result=new ArrayList<Integer>(); print(listNode); return result; }