题目来源:牛客网-剑指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;
}
}
如果本文对你有所帮助,要记得点赞哦~