题目描述
输入一个链表,从尾到头打印链表每个节点的值。
输入描述:
输入为链表的表头
输出描述:
输出为需要打印的“新链表”的表头
解决方案:
1:不使用系统api,即手动构造stack
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
int length = 0;
ListNode node = listNode;
//第一次遍历,计算链表的长度
while(node != null){
length++;
node = node.next;
}
int[] stack = new int[length];
ArrayList<Integer> list = new ArrayList<>(length);
if(length != 0){
node = listNode;
int top = -1;
//第二次遍历,所有值入栈
while(node != null){
stack[++top] = node.val;
node = node.next;
}
//第三遍遍历,赋给list
while(top > -1){
list.add(stack[top--]);
}
}
return list;
}
}
2:使用集合类中的栈
Stack
解决
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> stack = new Stack<Integer>();
while(listNode != null){
stack.push(listNode.val);
listNode = listNode.next;
}
ArrayList<Integer> list = new ArrayList<Integer>();
while(!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
}
3:递归解决,本质上还是用栈来解决。注意在大数据量上递归可能会出现问题。
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode == null){
return new ArrayList<Integer>();
}
ArrayList<Integer> list = null;
//只在最后一个节点时进行list的初始化
if(listNode != null && listNode.next == null){
list = new ArrayList<Integer>();
list.add(listNode.val);
}else if(listNode != null && listNode.next != null){
list = printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}