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); } }