美文网首页
《剑指offer》(三)-从头到尾打印链表(java)

《剑指offer》(三)-从头到尾打印链表(java)

作者: 鼠小倩 | 来源:发表于2019-11-06 13:54 被阅读0次

    从头到尾打印链表

    题目描述

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

    代码格式要求

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            
        }
    }
    

    解题一

    1.思路:调用一个函数
    ArrayList的add(index,value),可以指定index位置插入value,所以在遍历ListNode的同时,将值插入到index=0的位置上,这样就可以反向输出。
    2.代码

    package jianzhi_offer;
    import java.util.ArrayList;
    public class Solution3_1 {
        /**
         * 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
         * @param listNode
            * 非递归的方法
         */
        public static 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;
       }
    //测试
        public static void main(String[] args) {
            ListNode listNode1 = new ListNode(1);
            ListNode listNode2 = new ListNode(2);
            ListNode listNode3 = new ListNode(3);
            ListNode listNode4 = new ListNode(4);
            ListNode listNode5 = new ListNode(5);
            ListNode listNode6 = new ListNode(6);
            listNode1.next = listNode2;
            listNode2.next = listNode3;
            listNode3.next = listNode4;
            listNode4.next = listNode5;
            listNode5.next = listNode6;
            ArrayList <Integer> arr = printListFromTailToHead(listNode1);
            System.out.println(arr);
        } 
    }
    
    public class ListNode {
        int val;
        ListNode next = null;
        ListNode(int val) {
        this.val = val;
        }
    }
    
    

    3.复杂度
    时间复杂度:O(n)
    空间复杂度:O(n)

    解题二

    1.思路
    运用递归实现
    2.代码

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

    3.复杂度
    时间复杂度:O(n)
    空间复杂度:O(n)

    解题三(*)

    1.思路
    根据题意要求从尾到头的顺序,ListNode是链表,只能从头遍历到尾,所以考虑用栈的思想。
    2.代码

    package jianzhi_offer;
    import java.util.ArrayList;
    import java.util.Stack;
    
    public class Solution3_3 {
    //运用栈的思想
    public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            ArrayList<Integer> list = new ArrayList<>();
            Stack<Integer> stack = new Stack<>();
            while (listNode != null) {
                 stack.push(listNode.val);
                 listNode = listNode.next;
             }
            while (!stack.empty()) {
                  list.add(stack.pop());
            }
            return list;
        }
    }
    

    相关文章

      网友评论

          本文标题:《剑指offer》(三)-从头到尾打印链表(java)

          本文链接:https://www.haomeiwen.com/subject/wuhupctx.html