1. 程式人生 > >5.從尾到頭列印連結串列(Java)

5.從尾到頭列印連結串列(Java)

從尾到頭列印連結串列

  • 題目描述

輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。

  • 具體實現:

    解法一:

    解題思路:有點浪費空間的做法,需要建立兩個ArrayList物件,

    • 用list來儲存連結串列中從頭到尾的資料,再把list中的資料反轉到list2中即是結果。
/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list = new ArrayList<Integer>(); ArrayList<Integer> list2 = new ArrayList<Integer>(); while(listNode != null) {//先把連結串列的資料從頭到尾儲存在list中 list.add(
listNode.val); listNode = listNode.next; } for(int i = list.size()-1; i >= 0; i--) {//把list反轉到list2中 list2.add(list.get(i)); } return list2; }

解法二:

解題思路:優化做法,利用遞迴的特性,執行到中途呼叫遞迴直到出口再一個個返回來計算,這樣就可以完美地從連結串列的末尾開始取到資料。直接判斷當前結點是否為null,不為空就一直呼叫下一個結點,直到最後一個結點就開始新增資料到arrayList中,從連結串列的尾端一個一個地新增到arrayList中,最後結果就是返回這個arrayList即可。

import java.util.ArrayList;
public class Solution {
	ArrayList<Integer> arrayList=new ArrayList<Integer>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    	if(listNode != null) {
    		this.printListFromTailToHead(listNode.next);
    		arrayList.add(listNode.val);
    	}
    	return arrayList;
    }
}