題目來源:牛客網-劍指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;
}
}
如果本文對你有所幫助,要記得點贊哦~