剑指offer3-从尾到头打印链表

剑指offer3-从尾到头打印链表

1、题目描述

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

2、思路分析

从头到尾打印链表比较简单,从尾到头很自然的可以想到先将链表进行反转,然后再打印。但是,通常我们不希望改变原链表的结构,这是一个只读操作。
因此,我们进一步分析,可以发现排在后面的先输出,这是一个典型的“后入先出”的思想,因此很自然的可以想到用栈来实现,每遍历一个结点,可以将其压入栈中,遍历结束后再逐个弹栈,将结点值存入ArrayList,这样就实现了从尾到头的打印。
更进一步,既然想到了用栈,那一定可以通过递归来实现。每访问到一个结点,先递归输出其后的结点,在输出该结点自身即可。

3、代码

package com.jianzhioffer;

import java.util.Stack;


public class offer_03 {
    public static class ListNode {
        int val; // 结点的值
        ListNode next; // 下一个结点
    }

    /**
     * 方法一:借助栈的后入先出实现
     * @author : 作者名称
     * @date : 2020-03-12 17:59
     * @param root :
     * @return : void
     */

    public static void  printListFromTailToHead(ListNode root) {
        Stack<ListNode> stack=new Stack<>();
        while (root!=null) {
            stack.push(root);
            root=root.next;
        }
        ListNode tmp;
        while(!stack.isEmpty()) {
            tmp=stack.pop();
            System.out.print(tmp.val+ " ");
        }

    }
    /**
     * 递归实现
     * @author : 作者名称
     * @date : 2020-03-12 18:01
     * @param root :
     * @return : void
     */

    public static void printListInverselyUsingRecursion(ListNode root) {
        if (root != null) {
            printListInverselyUsingRecursion(root.next); //先递归输出其后的结点
            System.out.print(root.val + " ");//再输出自身
        }
    }


    public static void main(String[] args) {
        ListNode root = new ListNode();
        root.val = 1;
        root.next = new ListNode();
        root.next.val = 2;
        root.next.next = new ListNode();
        root.next.next.val = 3;
        root.next.next.next = new ListNode();
        root.next.next.next.val = 4;
        root.next.next.next.next = new ListNode();
        root.next.next.next.next.val = 5;

        printListFromTailToHead(root);
        System.out.println("\n");
        printListInverselyUsingRecursion(root);


    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章