剑指Offer:面试题06——从尾到头打印链表(java)

从尾到头打印链表

1. 问题描述

  • 给一个单向链表,请头尾到头进行打印数据

2. 算法思路

  • 思路一:定义一个ArrayList(动态数组),遍历链表进行存储,然后倒序输出

    • 但是我们可以想一下,其实我们无非就是用一块内存进行存储,先存储的最后进行输出,那么先进后出的顺序不就是栈的数据结构吗?所以我们立马就可以想到用栈去做‘’
  • 思路二: 定义一个Stack(栈),遍历链表进行压栈,最后进行出栈

    • 我们既然想到了用栈,那么其实就要往递归的方向去思考了,因为递归和栈的思路都是通的,大部分用栈解决的问题都可以用递归解决。就如同树的前中后遍历一样,用递归和栈的方法都是可以完成的!
  • 思路三:递归的方法,每次遍历一个节点都先遍历它后面的节点

3. 算法实现(三种都有)

3.1 递归实现

/**
     * 递归
     * @param head
     */
    public static void printListNode2(ListNode head){

            if (head.next != null){
                printListNode2(head.next);
            }
            System.out.println(head.val);

    }

3.2 栈实现

 /**
     * 使用栈去做
     * @param head
     */
    public static void printListNode1(ListNode head){

        Stack<Integer> stack = new Stack<>();

        while(head != null){
            stack.push(head.val);
            head = head.next;
        }

        while(!stack.isEmpty()){
            System.out.println(stack.pop());
        }

    }

3.3 数组实现

 public static void printListNode(ListNode head){

        ArrayList<Integer> list = new ArrayList<>();
        while(head != null){
            list.add(head.val);
            head = head.next;
        }

        for(int i = list.size() - 1; i >= 0; i--){
            System.out.println(list.get(i));
        }


    }

4.总结

  • 看问题没有看到本质,思路是有的,知道必须用一块内存去存储,然后倒序输出,但是没有想到先入后出的数据结构,自然就没有想到栈
  • 想到了栈就应该想到递归!这是应该有的思路

你可能感兴趣的:(剑指Offer,链表,数据结构,java,从尾到头打印链表,剑指offer)