Day05 2023/03/03
难度:简单
题目
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。如输入L,2,3的链表如下图:
返回一个数组为(3,2,1) 0<=链表长度<=10000
示例1:
1 2 3
返回结果:
3 2 1
示例2:
67 0 24 58
返回结果:
58 24 0 67
思路:
先用数组接受链表中的数据,然后对数组中的数进行反转;
//定义一个变量表示链表长度,方便开数组;
定义一个LIst Node 指向第一个节点;
利用while循环得出链表长度
开两个数组,一个用来按照链表顺序接收数值,第二个数组用来把第一个数组的值反过来
长度都为链表的长度
利用第二个数组把第一个数组的值反过来
经过上一步的i已经自增到数组的长度了,所以此时可以直接用
代码:
static int[] returnArr(ListNode node){
//定义一个变量表示链表长度,方便开数组;
int length = 1;
//定义一个LIst Node 指向第一个节点;
ListNode temp = node;
//利用while循环得出链表长度
while (temp.next != null){
length++;
temp = temp.next;
}
//在把temp指回第一个节点;
temp = node;
//开两个数组,一个用来按照链表顺序接收数值,第二个数组用来把第一个数组的值反过来
//长度都为链表的长度
int ans1[] = new int[length];
int ans2[] = new int[length];
int i = 0;
while (temp != null){
//i自增,把当前节点的值赋给数组之后,再把节点往后移
//这边必须是i++
ans1[i++] = temp.data;
temp = temp.next;
}
//利用第二个数组把第一个数组的值反过来
//经过上一步的i已经自增到数组的长度了,所以此时可以直接用
//这边必须--i,如果是i--会越界,
for (int j = 0; j < length; j++){
ans2[j] = ans1[--i];
}
return ans2;
}
- 时间复杂度 O(n)--- 创建链表的时间复杂度为O(n)
- 空间复杂度 O(n)--- 链表属于必要空间,利用了两个数组;