刷算法

100 阅读1分钟

剑指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循环的方法高一些,推测是自带方法的原因,源码暂时还没有看,相信看完了之后会有更深的理解。