原始题目:剑指 Offer 06. 从尾到头打印链表 (opens new window)
# 方法一
先遍历整个链表,求得链表的长度 ,然后创建一个长度 的数组 。倒序遍历数组 ,而链表正序遍历,将链表的值赋值到数组中。
代码:
public int[] reversePrint(ListNode head){
if(head == null) {
return new int[0];
}
int len = 0;
ListNode p = head;
while(p != null) {
len++;
p = p.next;
}
int[] ans = new int[len];
for(int i = len-1; i >= 0; i--){
ans[i] = head.val;
head = head.next;
}
return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
复杂度分析
- 时间复杂度:遍历链表和遍历数组的操作均为 时间。
- 空间复杂度: 数组需要 空间。
# 方法二
使用辅助栈,借助栈的先进后出的特点,将链表的元素先全部压入栈中,然后再弹出。
代码:
public int[] reversePrint(ListNode head){
if(head == null) {
return new int[0];
}
Deque<Integer> stack = new LinkedList<>();
while(head != null) {
stack.push(head.val);
head = head.next;
}
int[] ans = new int[stack.size()];
int k = 0;
while(!stack.isEmpty()){
ans[k++] = stack.pop();
}
return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
复杂度分析
- 时间复杂度 :入栈和出栈共使用 时间。
- 空间复杂度 :辅助栈 和 共使用 空间。