• 剑指offer(6)——从尾到头打印链表


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

    思路分析:

    方法一:利用栈的先进后出思想实现,加上判断条件后17ms,刚开始24ms

    class Solution {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            // 1.判断链表为空或为1
            // 判断链表为空的情况
            if (listNode == null) {
                return new ArrayList<Integer>();
            }
            // 判断链表为1的情况,不用反转
            if (listNode.next == null) {
                return new ArrayList<>(listNode.val);
            }
            //2. 只要链表不为空,压栈操作,一直找下一个节点,直到空
            Stack<Integer> stack = new Stack<>();
            while (listNode != null) {
                stack.push(listNode.val);
                listNode = listNode.next;
            }
            //3.新建一个list用来存入弹出的值
            ArrayList<Integer> list = new ArrayList<>();
            //4.只要栈不为空,就弹出来
            while (!stack.empty()) {
                list.add(stack.pop());
            }
            //5. 返回list
            return list;
        }
    }
    
    
    class Solution6_2 {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    
            //2. 压栈操作
            Stack<Integer> stack = new Stack<>();
            while (listNode != null) {
                stack.push(listNode.val);
                listNode = listNode.next;
            }
            //3. 返回一个List
            ArrayList<Integer> list = new ArrayList<>();
            while (!stack.empty()) {
                list.add(stack.pop());
            }
            return list;
        }
    
    }
    

    方法二:利用递归思想实现

    注意:要将list定义在递归函数外面。

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

    方法三:利用list中的方法:add(int index, Object ele):在index位置插入ele元素

    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;
        }
    }
    

    总结:

    1. ad(0, ele):在0位置插入ele元素,再次调用的时候,会把之前的元素放到顺次移动

          public static void main(String[] args) {
      
              List<Integer> list = new ArrayList<>();
              for(int i = 0;i<10;i++){
                  list.add(0,i);
              }
      
              System.out.print("测试list的add方法"+list);
              // 测试list的add方法[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
              // void add(int index, Object ele):在index位置插入ele元素
          }
      
    2. 注意所给链表为空或长度为1的情况,需要给出判断

  • 相关阅读:
    HDU 3336 Count the string(KMP+DP)
    PHP 错误与异常 笔记与总结(13 )自定义异常类
    数据分析中,你认为用户行为分析最重要的点是什么
    数据分析中,你认为用户行为分析最重要的点是什么
    如何进行大数据分析及处理_数据分析师
    如何进行大数据分析及处理_数据分析师
    大数据与传统数据的区别_数据分析师
    大数据与传统数据的区别_数据分析师
    数据分析师 之量化用户研究
    数据分析师 之量化用户研究
  • 原文地址:https://www.cnblogs.com/benjieqiang/p/11401484.html
Copyright © 2020-2023  润新知