题目描述:
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
解题思路:
1、典型的“先进后出”,可以用栈来实现
(1)每经过一个节点,把该节点放在一个栈中。
(2)遍历完整个链表后,再从栈顶开始逐个输出节点的值。
此时输出的节点顺序已经反转过来了
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.*;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList list = new ArrayList();
Stack stack = new Stack();
while(listNode != null){
stack.push(listNode.val);
listNode = listNode.next;
}
while(!stack.empty()){
list.add(stack.pop());
}
return list;
}
}
2、递归实现
递归本质上就是一个栈结构,于是很自然的就想到了可以用递归实现
(1)访问到一个节点时,先递归输出它后面的节点,再输出该节点本身。
import java.util.ArrayList;
import java.util.*;
public class Solution {
ArrayList list = new ArrayList();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode != null){
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}
3、反转链表
/**
* 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> arr=new ArrayList<>();
ListNode cur=listNode;
ListNode prev=null;
ListNode newHead=null;
while(cur!=null){
ListNode curNext=cur.next;
if(curNext==null){
newHead=cur;
}
cur.next=prev;
prev=cur;
cur=curNext;
}
while(newHead!=null){
arr.add(newHead.val);
newHead=newHead.next;
}
return arr;
}
}