题目
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
- 0 <= 链表长度 <= 10000
解题
解法1
主要思路:先遍历链表获取长度,然后再初始化一定长度的数组,再遍历链表获取元素倒叙放入数组内;也可以利用栈的额外空间;
时间复杂度:O(N) N表示链表长度
空间复杂度:O(1) 返回的数组不算
public int[] reversePrint(ListNode head) {
if (head == null) return new int[0];
ListNode cur = head;
int count = 0;
while (cur != null) {
count++;
cur = cur.next;
}
int[] res = new int[count];
cur = head;
while (cur != null) {
res[--count] = cur.val;
cur = cur.next;
}
return res;
}
解法2
主要思路:迭代遍历元素并逆序获取元素的值,放入集合内,然后遍历集合放置数组内;
时间复杂度:O(N) N表示链表长度
空间复杂度:O(N) 使用链表 N表示链表长度
List<Integer> list = new ArrayList<Integer>();
public int[] reversePrint1(ListNode head) {
recur(head);
int i = 0;
int[] res = new int[list.size()];
for (Integer temp : list) {
res[i++] = temp;
}
return res;
}
void recur(ListNode head) {
if (head == null) return;
recur(head.next);
list.add(head.val);
}