1. 程式人生 > >劍指offer面試題6:從尾到頭列印連結串列(Java實現)

劍指offer面試題6:從尾到頭列印連結串列(Java實現)

題目:輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。

思路:因為要實現從頭到尾遍歷,然後從尾到頭列印,也就是說第一個遍歷到的最後一個列印,最後遍歷到的第一個列印,這很明顯符合棧 “先進後出” 的特點,所以我們可以利用棧來實現這種順序。

測試用例:

  1. 功能測試:輸入的連結串列有多個節點或只有一個節點。
  2. 負面測試:輸入的連結串列頭結點指標為空。

程式碼實現有兩種方式:藉助棧實現,或使用遞迴的方法。

public class ListNode {
	
	 	int val;
	 	ListNode next = null;
	 	ListNode(int val) {
	    this.val = val;
	 	}
}

public class test_six {

	//用棧基於迴圈實現
	public ArrayList<Integer> printListFormTailToHead(ListNode listNode){
		ArrayList<Integer> list = new ArrayList<>();
		if(listNode == null)return list;            //這裡要注意不是返回null
		Stack<ListNode> stack = new Stack<>();
		while(listNode != null){
			stack.push(listNode);
			listNode = listNode.next;
		}
		while(!stack.isEmpty()){
			list.add(stack.pop().val);
		}
		return list;
	}
}
		//遞迴方法實現,本質也是一個棧結構
	    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
	    	ArrayList<Integer> arrayList=new ArrayList<Integer>();
	        if(listNode!=null){
	            printListFromTailToHead(listNode.next);
	            arrayList.add(listNode.val);
	        }
	        return arrayList;
	    }