题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
解法1:普通的集合接收反向遍历用数组接收
public int[] reversePrint(ListNode head) {
ListNode temp = head;
int length = 0;
List<Integer> list = new ArrayList<>();
while(temp !=null){
length++;
list.add(temp.val);
temp = temp.next;
}
int[] res = new int[length];
for(int i=0;i<length;i++){
res[i] = list.get(length-i-1);
}
return res;
}
复杂性分析:
时间复杂度:O(n),正向遍历一遍链表,同时存入集合,集合只做插入操作,时间取决于链表长度
空间复杂度:O(n),本来只有一个链表要空间,这里单独定义了一个集合来存链表的元素。
解法2:反向输出,符合栈先进后出的特点
public int[] reversePrint(ListNode head) {
Stack<ListNode> stack = new Stack<ListNode>();
ListNode temp = head;
while(null != temp){
stack.push(temp);
temp = temp.next;
}
int length = stack.size();
int[] result = new int[length];
for(int i = 0;i<length;i++){
result[i] = stack.pop().val;
}
return result;
}
复杂性分析:
时间复杂度:O(n),正向遍历一遍链表,又从栈弹出,相当于逆向遍历了一遍链表,而遍历链表的时间,取决于链表长度
空间复杂度:O(n),本来只有一个链表要空间,这里单独定义了一个栈来存链表。