①题目:给一个链表,以从尾到头的顺序把元素放到数组中返回。
public int[] reversePrint(ListNode head)
思路:1.先遍历一遍链表,得到size。然后用size声明数组res,再遍历一遍链表,把每个元素反着放到res中。没有额外的空间使用,时间复杂度O(n)。
2.也可以用栈存储遍历的元素,再弹出放到数组中。
public int[] reverseList(ListNode head){
if(head == null){
return new int[]{};
}
ListNode p = head;
int size = 0;
while(p != null){
size++;
p = p.next;
}
int[] res = new int[size];
p = head;
//因为size一样,所以p不用判空
for (int i = size-1; i >= 0; i--) {
res[i] = p.val;
p = p.next;
}
return res;
}
②题目:给一个链表,从尾到头打印元素,没有返回值。
public void reversePrint(ListNode head)
思路:1.先反转链表(遍历一遍链表),再打印。如果不想修改链表参数,就再反转一下(再遍历一遍链表)。无额外的空间使用。
细节看 反转链表 那一题。
2.用栈保存链表元素,弹出再逐个输出。