zoukankan      html  css  js  c++  java
  • 剑指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的情况,需要给出判断

  • 相关阅读:
    Goflyway
    amd 阉割理论
    wget命令下载页面里所有资源文件
    linux fpcup-Lazarus_fpcupdeluxe TEncoding 乱码
    Error: (lazbuild) 不能加载包 fpcupdeluxe 手工干预卸载问题模块
    集合 数据 指针方法操作集合
    cmake windows pthread
    4 bit all 15
    Parser b2c
    Offline Explorer 规则
  • 原文地址:https://www.cnblogs.com/benjieqiang/p/11401484.html
Copyright © 2011-2022 走看看