題目描述:
輸入一個鏈表,按鏈表從尾到頭的順序返回一個ArrayList。。
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
}
}
思路
第一種思路
從頭到尾遞歸輸出,遞歸是屬於棧的一種思想,其實就是倒序往ArrayList裏面進行壓入;
如果我們想實現正序,只需要把壓入ArrayList的操作在遞歸函數之前就可以了。
第二種思路
任何一種遞歸都能用循環寫出來,所以第二種方法就是使用循環實現。
代碼實現
第一種思路
import java.util.ArrayList;
public class Main {
static ArrayList<Integer> arrayList = new ArrayList<>();
public static void main(String[] args) {
ListNode listNode = new ListNode(1);
ListNode listNode11 = new ListNode(2);
ListNode listNode12 = new ListNode(3);
listNode.next = listNode11;
listNode11.next = listNode12;
arrayList = printListFromTailToHead(listNode);
}
public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode != null)
{
printListFromTailToHead(listNode.next);
arrayList.add(listNode.val);//上下兩行交換順序就可以實現正序
}
return arrayList;
}
}
class ListNode
{
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
第二種思路
每次插入list的時候都在頭上插入,這種方式java實現是通過向後移插入後面的元素,所以每次這樣效率會很低。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> arrayList = new ArrayList<>();
while (listNode!=null)
{
arrayList.add(0,listNode.val);//這種方式java實現是通過向後移插入後面的元素,所以每次這樣效率會很低。
listNode = listNode.next;
}
return arrayList;
}
順序插入完後,進行反轉。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> arrayList = new ArrayList<>();
while (listNode!=null)
{
listNode = listNode.next;
}
Collections.reverse(arrayList);//使用Collections的reverse方法,直接將list反轉,這樣只操作一次,不需要再每次去後移,相對而言效率好一點。
return arrayList;
}
歡迎關注我的個人博客zenshin’blog