1. 程式人生 > >【劍指Offer學習】【面試題5 : 從尾到頭列印連結串列】【思路】

【劍指Offer學習】【面試題5 : 從尾到頭列印連結串列】【思路】

方案一:(後進先出)遍歷連結串列,再從棧頂開始出個輸出結點的值,此時輸出的結點的順序已經反轉過來了。

  1. 先推進棧
  2. 再依次取出棧頂元素

方案二:遞迴。

  1. 判斷連結串列頭結點是否為空
  2. 將 next 結點作為下一次的實參
  3. 輸出當前棧頂元素。

缺點:當連結串列非常長的時候,會導致函式呼叫的層級很深,從而有可能導致函式呼叫棧溢位。

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