题目描述:
解法1:
首先定义一个list集合,用递归法遍历链表,用list集合保存每个节点的索引值,直到最后一个节点为空。然后定义一个数组,遍历list集合,把list集合第一个元素值赋给数组倒数第一个元素,第二个元素值赋给数组倒数第二个元素,依次类推即可。
class Solution {
public int[] reversePrint(ListNode head) {
List list=new ArrayList();
bianli(head,list);
int []nums=new int[list.size()];
for(int i=0;i<list.size();i++){
nums[i]=(int)list.get(list.size()-i-1);
}
return nums;
}
void bianli(ListNode head,List list){
if(head==null) return ;
list.add(head.val);
bianli(head.next,list);
}
}
解法2:
上面的解法因为定义了一个list集合,所以导致它的运行时间大大增加。那直接使用数组存放每次递归获得的元素索引值可不可以呢?当然是可以的。不过这个方法前提是必须知道链表的长度,这样才能静态定义一个数组,然后给他赋值。我们可以用一个while循环判断,定义一个变量存放链表的长度,每次节点不为空,则变量加1,继续判断它的子节点,直到为空跳出循环。
class Solution {
public int[] reversePrint(ListNode head) {
int length=changdu(head);
int []nums=new int[length];
bianli(head,nums,length);
return nums;
}
int changdu(ListNode head){
int count=0;
while(head!=null){
count++;
head=head.next;
}
return count;
}
void bianli(ListNode head,int []nums,int i){
if(head==null) return ;
bianli(head.next,nums,i-1);
nums[i-1]=head.val;
}
}