【劍指Offer學習】【面試題5 : 從尾到頭列印連結串列】【思路】
阿新 • • 發佈:2018-11-03
方案一:(後進先出)遍歷連結串列,再從棧頂開始出個輸出結點的值,此時輸出的結點的順序已經反轉過來了。
- 先推進棧
- 再依次取出棧頂元素
方案二:遞迴。
- 判斷連結串列頭結點是否為空
- 將 next 結點作為下一次的實參
- 輸出當前棧頂元素。
缺點:當連結串列非常長的時候,會導致函式呼叫的層級很深,從而有可能導致函式呼叫棧溢位。
package 從尾到頭列印連結串列05; import java.util.Stack; public class Demo { /** * 結點物件 * @author Administrator */ public static class ListNode { int val; // 結點的值 ListNode nxt; // 下一個結點 } /** * 輸入一個連結串列的頭結點,從尾到頭返貨來列印每個結點的值 * 使用棧的方式進行(先進後出) * @param root 連結串列頭結點 */ public static void printListInverselyUsingIteration(ListNode root) { // Stack:棧,特性是:先進後出(FILO, First In Last Out)。 // Stack也是通過陣列實現的,而非連結串列 Stack<ListNode> stack = new Stack<>(); while (root != null) { // 連結串列頭結點不為空 stack.push(root); // 頭結點推入棧中 root = root.nxt; // 下一節點變為頭結點,作為下一次的實參 } ListNode tmp; while (!stack.isEmpty()) { // 棧不為空 tmp = stack.pop(); // 取出棧頂元素,賦予 tmp System.out.println(tmp.val); // 輸出棧頂元素 } } /** * 遞迴 * 輸入個連結串列的頭結點,從尾到頭反過來打印出每個結點的值 * 使用棧的方式進行 * @param root 連結串列頭結點 */ public static void printListInverselyUsingRecursion(ListNode root) { if (root != null) { // 連結串列頭結點不為空 printListInverselyUsingRecursion(root.nxt); // 遞迴 System.out.println(root.val + " "); // 輸出棧頂元素 } } public static void main(String[] args) { ListNode root = new ListNode(); root.val = 1; root.nxt = new ListNode(); root.nxt.val = 2; root.nxt.nxt = new ListNode(); root.nxt.nxt.val = 3; root.nxt.nxt.nxt = new ListNode(); root.nxt.nxt.nxt.val = 4; root.nxt.nxt.nxt.nxt = new ListNode(); root.nxt.nxt.nxt.nxt.val = 5; printListInverselyUsingIteration(root); System.out.println(); printListInverselyUsingRecursion(root); } }