[程式設計題]從尾到頭列印連結串列 牛客網練習 java遞迴

matthew_leung發表於2020-11-24

連結:https://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035?answerType=1&f=discussion
來源:牛客網
 

[程式設計題]從尾到頭列印連結串列

輸入一個連結串列,按連結串列從尾到頭的順序返回一個ArrayList。

示例1

輸入

{67,0,24,58}

輸出

[58,24,0,67]

分析:

這裡面其實不是什麼難點,就是一個連結串列逆序的問題。

然後我主要是我為了增加自己的演算法熟練度的,所以更多的時候是使用自己不熟練的方案。所以會有優化版本,如果我沒有寫出來,各位大佬可以評論區教一下!!!

/**
     *方法一:遞迴實現,定義一個遞迴函式,完成遞迴即可。
     * 注意判斷為空連結串列的情況即可
     */
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> result = new ArrayList<>();
        if (listNode != null){
            backout(result, listNode);
        }
        return result;
    }

    private void backout(ArrayList<Integer> result, ListNode listNode) {
        if (listNode.next != null) {
            backout(result, listNode.next);
            result.add(listNode.val);
        } else {
            result.add(listNode.val);
            return;
        }
    }
/**
     * 方法二:在外部定義一個返回型別的變數,然後直接利用命題函式實現遞迴。
     * 這個方法在我工作以後不是很喜歡用,因為這個成員變數不利於資料的安全性
     */
    ArrayList<Integer> list = new ArrayList();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode!=null){
            printListFromTailToHead(listNode.next);
            list.add(listNode.val);
        }
        return list;
    }

 

/**
     *方法三,利用ArrayList中插入方法的特性,指定對應位置的插入,同時將原資料後移。
     * 這個方案一開始我也沒有想到,因為這個對jdk的api用習慣以後有一定的慣性思維。
     * 後面我貼出add方法的api說明:
     *  Inserts the specified element at the specified position in this
     *  list. Shifts the element currently at that position (if any) and
     *  any subsequent elements to the right (adds one to their indices).
     */
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<>();
        ListNode tmp = listNode;
        while(tmp!=null){
            list.add(0,tmp.val);
            tmp = tmp.next;
        }
        return list;
    }

 

相關文章