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