剑指offer一:从尾到头打印链表
题目:输入一个{1,2,3}的链表,要求打印[3,2,1]
方法一 : 用栈先进先出的特性
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.*;
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//利用栈先进后出的结果
Stack<Integer> result = new Stack();
while(listNode != null){
result.add(listNode.val);
listNode = listNode.next;
}
ArrayList<Integer> list = new ArrayList();
while(!result.isEmpty()){
list.add(result.pop());
}
return list;
}
}
这个方法应该是最直观的方法,我们知道栈的特性是先进后出,一个元素先进入他是在栈底,然后倒数第二,然后第三,取出来的话就是第三--->第二--->第一。
这个方法需要注意的是,首先你得遍历链表,其实就是listNode = listNode.next; 这里其实我们可以将每个节点的值取出来存到一个链表当中,当然栈的话就直接压进去,然后我们用pop这个方法取出来放到链表中,返回链表即可。
ArrayList<Integer> list = new ArrayList();
ListNode node = listNode;
while(node != null){
list.add(node.val);
node = node.next;
}
//链表反转
Collections.reverse(list);
// Integer i,j,k;
// for(i=0,j=list.size()-1;i<=j;i++,j--){
// k = list.get(i);
// list.set(i,list.get(j));
// list.set(j,k);
// }
return list;
这是第二种方法,也挺直观的,遍历链表的时候,将每个节点的值取出来,然后依次存入到一个新的链表里面,然后利用reverse方法反转链表,或者用一个for循环。这里用自带的reverse响应时间要稍微短一些,但是占用内存比for循环的方法高一些,推测是自带方法的原因,源码暂时还没有看,相信看完了之后会有更深的理解。