《剑指offer》从头到尾打印链表

题目

题目描述
输入一个链表,从尾到头打印链表每个节点的值。

ps:

注意本题并不是考察LinkedList的知识。
Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
https://www.cnblogs.com/skywang12345/p/3308807.html

解法1:递归

思路

把链表的值倒序存储在动态数组ArraryList,但链表本身遍历本身是顺序的,考虑使用递归的思路,一层函数套一层,最里面那层反而是最先计算的,也就从链表的尾部开始计算。
这里要注意:ArrayList的初始化一定要放在函数外面,放在里面,是没法递归的,这里要将它看做成一个全局变量。

代码:

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {        
    ArrayList<Integer> alist=new ArrayList<Integer>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {        
        if(listNode!=null)
        {
            printListFromTailToHead(listNode.next);
            alist.add(listNode.val);
        }
        return alist;
    }
}

解法2:递归

思路

考虑到stack先进先出的特性,链表的头放进栈,出栈的时候尾部会先出来。

代码:

运行时间:12ms

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.Stack;
import java.util.ArrayList;
public class Solution {         
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {        
        ArrayList<Integer> alist=new ArrayList<Integer>();
        Stack<Integer> st=new Stack<Integer>();
        while(listNode!=null)
        {
            st.push(new Integer(listNode.val));
            listNode=listNode.next;  
        }
        while(!st.isEmpty())
        {
            alist.add(st.pop());
        }
        return alist;
    }
}

猜你喜欢

转载自blog.csdn.net/gsch_12/article/details/80636851