输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
方法一:利用栈的先进后出原则
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int[] reversePrint(ListNode head) {
Stack<ListNode> stack= new Stack<ListNode>();
ListNode temp=head;
//入栈
while(temp!=null){
stack.push(temp);
temp=temp.next;
}
int size=stack.size();
int[] arr=new int[size];
for(int i=0;i<arr.length;i++){
//出栈将值赋给数组
arr[i]=stack.pop().val;
}
return arr;
}
}
方法二:遍历
/**
1. Definition for singly-linked list.
2. public class ListNode {
3. int val;
4. ListNode next;
5. ListNode(int x) { val = x; }
6. }
*/
class Solution {
public int[] reversePrint(ListNode head) {
int count=0;
ListNode node=head;
//遍历得到链表的长度
while(node!=null){
count++;
node=node.next;
}
int[] print=new int[count];
//遍历将链表反向储存到数组中
for(int i=count-1;i>=0;i--){
print[i]=head.val;
head=head.next;
}
return print;
}
}
方法三:递归
- 递归阶段: 每次传入head.next,知道head==null为止,此时返回空数据
- 回溯阶段:在每一层回溯后,将head.val添加到集合列表中即list.add(head.val);
- 遍历将列表中的数据加入数组中,返回数据。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
ArrayList<Integer> list=new ArrayList<Integer>();
public int[] reversePrint(ListNode head) {
//调用递归方法
recur(head);
int[] print=new int[list.size()];
for(int i=0;i<list.size();i++){
//3. 将列表中的数据赋给数组
print[i]=list.get(i);
}
return print;
}
void recur(ListNode head){
if(head==null){
return;
}
//1.递归直到最后
recur(head.next);
//2. 将每一层回溯的数据加入list集合列表中
list.add(head.val);
}
}