劍指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);


    }


}

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