版权声明:转载请点赞,当然附上原文链接也很不错 https://blog.csdn.net/m0_37961948/article/details/88371386
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
要么用栈,要么递归. 1. 递归, 虽然很简洁易懂,但是可能会因为Node数目过多而爆掉. 2. 栈 如果可以使用Java自带的栈最好,不可以也不慌,就用一个ArrayList就够 从头到尾读入后翻转数组.
递归版非常简洁.
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> res = new ArrayList<>();
printListFromTailToHead(listNode, res);
return res;
}
private void printListFromTailToHead(ListNode listNode, ArrayList<Integer> res) {
// 优先先后走,直到走到尾部
if (listNode.next != null) {
printListFromTailToHead(listNode.next, res);
}
// 依次添加,前进后出,所以完成逆序功能
res.add(listNode.val);
}
使用Stack的版本就是上述的变阶,这里不再赘述.
如果只让我们使用一个ArrayList的话,从前到后添加,之后进行翻转,或者用一个int[] 。从后向前放置。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> res = new ArrayList<>();
// 从头到尾读入后翻转数组.
while (listNode != null) {
res.add(listNode.val);
listNode = listNode.next;
}
// 反转数组
int head = 0, last = res.size() - 1;
while (head < last) {
//swap(head,last)
int temp = res.get(head);
res.set(head, res.get(last));
res.set(last,temp);
head++;
last--;
}
return res;
}