从尾到头打印链表 ---剑指Offer(Java版)

版权声明:转载请点赞,当然附上原文链接也很不错 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;
    }

猜你喜欢

转载自blog.csdn.net/m0_37961948/article/details/88371386