链接:
https://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035
来源:牛客网
来源:牛客网
- 热度指数:357609 时间限制:1秒 空间限制:32768K
输入一个链表,从尾到头打印链表每个节点的值。
分析:
思路一:利用ArrayList的插入函数Add(index,element),表示将元素element插入到位置index之前,
列表后面的元素依次往后移动。循环遍历链表,然后把结点的元素依次插入到0之前即可。
/**
* 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> res = new ArrayList<Integer>();
while(listNode != null){
res.add(0,listNode.val);
listNode = listNode.next;
}
return res;
}
}
思路二:利用栈”先进后出“的特点,循环遍历数组先将链表的元素使用栈的push方法压入栈中,然后利用栈的pop方法将栈中的元素依次取出并从栈顶删除(pop()和peek()的区别详见
20. Valid Parentheses),并加入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> res = new ArrayList<Integer>();
Stack<Integer> stack = new Stack<>();
if(listNode == null)
return res;
while (listNode != null){
stack.push(listNode.val);
listNode = listNode.next;
}
while(!stack.isEmpty())
res.add(stack.pop());
return res;
}
}
思路三:使用递归方法,参考
grass_stars的回答,这里注意若ArrayList<Integer> arrayList=new ArrayList<Integer>();放进printListFromTailToHead方法里面则无法通过。这是jvm的堆概念,引用的概念。
/**
* 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 {
ArrayList<Integer> res = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode == null)
return res;
if(listNode != null){
this.printListFromTailToHead(listNode.next);
res.add(listNode.val);
}
return res;
}
}