描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
示例1
**
输入: {1,2,3}
返回值:[3,2,1]
示例2
输入:{67,0,24,58}
返回值:[58,24,0,67]
思路一
首先想到就是暴力遍历
ListNode
可能有些同学没学过数据结构,先学习一下 ListNode
public class ListNode {
int val;
ListNode next; // 下一个链表对象
ListNode(int x) { val = x; } //赋值链表的值
}
这个意思就是:
- 你想得到ListNode的值,就是ListNode.val,
- 你想得到ListNode的下一个对象,就是ListNode.next,
- 你想给ListNode赋值,就是ListNode(x)x是int类型
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode){
ArrayList<Integer> result =new ArrayList<Integer>();
while(listNode!=null)
{
result.add(0,listNode.val);
listNode=listNode.next;
}
return result;
}
}
头插法
上面的代码运用了一种方法叫做头插法,在考研数据结构中还是很常见的一种做题方法的。
头插法就是在链表的前面一个一个的插入一个节点,头插法可以让链表倒序。
思路二
这个想到栈的特点,先进后出,想一下火车道,火车用车头开进一个火车轨道里,只能用屁股出来。这不就是反序么?
于是运用递归的思想,懂得都懂,不懂我也没办法,这个递归只能自己动手,多模拟几次。
递归用的就是栈
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> result =new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null)
{
printListFromTailToHead(listNode.next);
result.add(listNode.val);
}
return result;
}
}
Arraylist
只需要知道 ArrayList 是个列表允许元素重复
set是个列表,不允许元素重复
map是个键值对表