003 从尾到头打印链表(栈或递归)
从尾到头打印链表(关键:用栈)
题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
分析:
listNode 是链表,只能从头遍历到尾,但是输出却要求从尾到头,这是典型的"先进后出",我们可以想到栈!
ArrayList 中有个方法是 add(index,value),可以指定 index 位置插入 value 值
所以我们在遍历 listNode 的同时将每个遇到的值插入到 list 的 0 位置,最后输出 listNode 即可得到逆序链表
//自己的实现方法
/**
* 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> stack = new ArrayList<>();
ArrayList<Integer> result = new ArrayList<>();
//ListNode tmp = listNode;
while (listNode!=null)
{
stack.add(listNode.val);
listNode = listNode.next;
}
int p = stack.size();
while (p-- > 0)
{
result.add(stack.get(p));
}
return result;
}
}
使用Java自带的栈Stack(自己实现,牛客网通过)
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//定义栈
Stack<Integer> stack = new Stack<>();
while(listNode!=null)
{
stack.push(listNode.val);//入栈
listNode = listNode.next;
}
//出栈
ArrayList<Integer> lst = new ArrayList<>();
while(!stack.isEmpty())
lst.add(stack.pop());
return lst;
}
递归(自己实现,牛客网通过)
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.*;
public class Solution {
// 注意:因为要用递归,存放结果的list要放在外面
ArrayList<Integer> lst = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null) // 判断当前指针指向的结点是否为空
{
if(listNode.next!=null) // 判断下一个结点是否为空
{
printListFromTailToHead(listNode.next);
}
lst.add(listNode.val);
}
return lst;
}
}
// 别人的代码
import java.util.*;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
ListNode tmp = listNode;
while(tmp!=null){
list.add(0,tmp.val);
tmp = tmp.next;
}
return list;
}
}