标签:
我一开始想到的是遍历这个链表,遍历过程中用一个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;
}
标签:
原文地址:http://www.cnblogs.com/qingfei1994/p/4834810.html