题目描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
牛客链接
解题思路一
可以使用stack的方式,但是这种方法会存在占用空间过大的问题
先创建一个栈,然后依次从头到尾循环将链表中的节点元素入栈,再创建一个数组集合,利用栈先进后出的特点将栈中的元素分别出栈添加到数组集合中,return 数组集合。
解题代码一
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.*;
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//先创建一个栈
Stack<Integer> st = new Stack<>();
//依次将链表中节点的元素入栈
while(listNode != null){
st.push(listNode.val);
listNode = listNode.next;
}
//创建一个数组集合
ArrayList<Integer> list = new ArrayList<>();
while(!st.empty()){
//将弹出的元素放入数组集合类中
list.add(st.pop());
}
return list;
}
}
解题思路二
首先创建一个数组集合,将链表中的元素依次放入数组集合中,然后将数组中的元素进行逆置,再return 逆置后的数组集合。
解题代码二
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.*;
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//先创建一个数组集合
ArrayList<Integer> list = new ArrayList<>();
while(listNode != null){
list.add(listNode.val);
listNode = listNode.next;
}
//然后将数组集合中的元素进行逆置
int i = 0;
int j = list.size()-1;
while(i < j){//i逐渐从0增大,j逐渐从尾部减小,对应交换,当两者相等碰头结束,不再进入交换循环
int temp = list.get(i);//首先将头部元素放入临时位置
list.set(i,list.get(j));//将尾部元素放入头部元素
list.set(j,temp);
i++;
j--;
}
return list;
}
}
解题思路三
采用递归的方式,这种方式在牛客中容易出现数组越界,不建议使用
解题代码三
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.*;
import java.util.ArrayList;
public class Solution {
public void printListFromTailToHeadHelper(ListNode listNode,ArrayList<Integer> list) {
if(listNode == null){ //这个是递归终点的地方
return;
}
printListFromTailToHeadHelper(listNode.next,list); //一步一步往下去,list先从后面往前add
list.add(listNode.val);
}
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//先创建一个数组集合
ArrayList<Integer> list = new ArrayList<>();
//递归的时候用下面的函数进行递归
printListFromTailToHeadHelper(listNode,list);
return list;
}
}