劍指Offer #03 從尾到頭打印鏈表(遞歸)

題目來源:牛客網-劍指Offer專題
題目地址:從尾到頭打印鏈表

題目描述

輸入一個鏈表,按鏈表從尾到頭的順序返回一個ArrayList。

題目解析

方法一:
因爲題目要求返回的順序是從尾到頭,所以我們可以採用遞歸的形式訪問鏈表,在迴歸的過程纔將節點的值存入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<Integer> ans = new ArrayList<Integer>();
        visitLinkedList(ans, listNode);
        return ans;
    }
    /**
      * 遞歸訪問鏈表
      * listNode表示當前訪問節點
      */
    private void visitLinkedList(ArrayList<Integer> ans, ListNode listNode) {
        if (listNode == null) {
            return ;
        }
        visitLinkedList(ans, listNode.next);
        //迴歸的過程纔將節點的值存入ArrayList中
        ans.add(listNode.val);
    }
}

方法二:
有的同學不想寫遞歸,沒關係~

其實計算機實現遞歸的方式就是利用棧,於是乎我們就可以用上棧這種數據結構,它具有“先進後出”這種特性。先遍歷鏈表,按順序將訪問到的節點都壓入棧中。最後,按照棧彈出元素的順序存入ArrayList中

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.Stack;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        Stack<Integer> stack = new Stack<Integer>();
        ArrayList<Integer> ans = new ArrayList<Integer>();
        ListNode p = listNode;
        //將訪問的元素壓入棧中
        while (p != null) {
            stack.add(p.val);
            p = p.next;
        }
        //按照棧的彈出順序存入ArrayList中
        while (!stack.isEmpty()) {
            ans.add(stack.pop());
        }
        return ans;
    }
}

如果本文對你有所幫助,要記得點贊哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章