003 从尾到头打印链表(栈或递归)

从尾到头打印链表(关键:用栈)

题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

分析:

listNode 是链表,只能从头遍历到尾,但是输出却要求从尾到头,这是典型的"先进后出",我们可以想到栈!
ArrayList 中有个方法是 add(index,value),可以指定 index 位置插入 value 值
所以我们在遍历 listNode 的同时将每个遇到的值插入到 list 的 0 位置,最后输出 listNode 即可得到逆序链表

//自己的实现方法
/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
         //定义栈
            ArrayList<Integer> stack = new ArrayList<>();
            ArrayList<Integer> result = new ArrayList<>();
            //ListNode tmp = listNode;
            while (listNode!=null)
            {
                stack.add(listNode.val);
                listNode = listNode.next;
            }
            
            int p = stack.size();
            while (p-- > 0)
            {
                result.add(stack.get(p));
            }
            return result;
        
    }
}

使用Java自带的栈Stack(自己实现,牛客网通过)

 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
         //定义栈
         Stack<Integer> stack = new Stack<>();
         while(listNode!=null)
         {
             stack.push(listNode.val);//入栈
             listNode = listNode.next;
         }
        
         //出栈
         ArrayList<Integer> lst = new ArrayList<>();
         while(!stack.isEmpty())
             lst.add(stack.pop());
        
         return lst;        
    }

递归(自己实现,牛客网通过)

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
import java.util.*;
public class Solution {
    
    // 注意:因为要用递归,存放结果的list要放在外面
    ArrayList<Integer> lst = new ArrayList<>(); 
    
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {    
        
        if(listNode!=null) // 判断当前指针指向的结点是否为空
        {
            if(listNode.next!=null) // 判断下一个结点是否为空
            {
                printListFromTailToHead(listNode.next);             
            }
            lst.add(listNode.val);
        }        
         return lst;     
    }
}
// 别人的代码
import java.util.*;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<>();
        ListNode tmp = listNode;
        while(tmp!=null){
            list.add(0,tmp.val);
            tmp = tmp.next;
        }
        return list;
    }
}
posted @ 2019-10-07 16:26  helloHKTK  阅读(275)  评论(0编辑  收藏  举报