目录
题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
解法一:使用栈
单向链表的逆序输出,我们可以很容易的想到使用一个栈作为辅助,栈的先进后出的特性能帮到我们大忙。(所以基础的数据结构是真的很重要)
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> result = new ArrayList<>();
if(listNode == null)return result;
Stack<Integer> stack = new Stack<>();
while(listNode != null){
stack.push(listNode.val);
listNode = listNode.next;
}
while(!stack.empty()){
result.add(stack.pop());
}
return result;
}
}
解法二:递归
从链表首节点开始进行递归,直到尾部为止,每次递归时都将当前结点的值加入列表中。随着递归过程,结点值会逆序加入到列表中。
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> result = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode == null)return result;
if(listNode != null){
//递归
printListFromTailToHead(listNode.next);
//当递归进行到尾结点时,才会执行将当前结点的值加入到列表中的操作
result.add(listNode.val);
}
return result;
}
}
解法三:将原链表逆转
这种方法想达到的目的是将原链表每个结点的next指针都指向前一个结点。所以需要两个变量next和pre分别记录当前节点的下一个结点和当前节点的上一个结点,然后将当前结点的next指针指向pre,并将pre和当前节点指针都向后移位,继续下一个结点的处理。处理完整个链表之后,遍历链表并将节点的值放入列表中
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> result = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode==null)return result;
ListNode pre = null; //记录上一个结点,初始值为null,头结点的上一个结点即为null
ListNode next = null; //记录下一个结点,便于后面的遍历
//遍历链表
while(listNode!=null){
next = listNode.next; //记录下一个结点
listNode.next = pre; //当前节点的next指针指向pre
pre = listNode; //pre指针和listNode指针都向后移位,继续下个节点的处理
listNode = next;
}
//遍历逆序完毕的节点,将每个节点的值放入result中
while(pre!=null){
result.add(pre.val);
pre = pre.next;
}
return result;
}
}