【劍指offer】鏈表——倒序打印鏈表

package cn.dzp.flyroc.offer;

import java.util.ArrayList;
import java.util.Stack;

public class PrintListFromTailToHeadDemo {

    /*題目描述:輸入一個鏈表,從尾到頭打印鏈表每一個節點的值*/

    /*思路:藉助棧實現,或用遞歸的方法
    * 棧思想:咱們先遍歷鏈表,遍歷到一個節點就將其壓入棧,直到全部節點都入棧,
    * 利用棧「先進後出的特色」,進行棧元素出站操做(首先是彈出棧頂節點 即,最後一個被壓入棧的節點)並打印節點的值,直到棧爲空*/

    //代碼實現

    //定義一個List節點的實現類
    public static class ListNode{

        int val;
        ListNode next = null;

        //定義構造方法
        ListNode(int val){
            this.val = val;
        }
    }
    public static ArrayList<Integer> printListFromTailTOHead(ListNode listNode){

        Stack<ListNode> stack = new Stack<>();      //建立棧對象,用來存放節點的值
        ArrayList<Integer> list = new ArrayList<>();        //建立動態list,用來存放從棧中彈出的元素

        if(listNode == null){       //判斷節點是否爲空
            return list;
        }

        while (listNode != null){       //節點不爲空
            stack.push(listNode);       //節點壓如棧中
            listNode = listNode.next;       //下一個節點

        }

        while (!stack.isEmpty()){       //棧不爲空
            list.add(stack.pop().val);      //棧中元素出棧,存到list中
        }
        System.out.println("list中元素:"+list.toString());
        return list;
    }

    public static void main(String[] args){

        //定義List節點
        ListNode l1 = new ListNode(1);
        ListNode l2 = new ListNode(2);
        ListNode l3 = new ListNode(3);
        ListNode l4 = new ListNode(4);
        ListNode l5 = new ListNode(5);

        //將節點關聯
        l1.next = l2;
        l2.next = l3;
        l3.next = l4;
        l4.next = l5;
        l5.next = null;

       printListFromTailTOHead(l1);
    }
}
相關文章
相關標籤/搜索