06-從尾到頭打印鏈表

輸入一個鏈表的頭節點,從尾到頭反過來返回每個節點的值(用數組返回)。

示例 1
輸入:head = [1,3,2]
輸出:[2,3,1]
限制:
0 <= 鏈表長度 <= 10000

思路1

如果允許更改結構, 那么可以先把鏈表反轉,在順序打印,此時不需額外的空間

class Solution {
    public int[] reversePrint(ListNode head) {
        if (head == null) return new int[0];
        ListNode tmp = head;
        ListNode next = tmp.next;
        tmp.next = null;
        int size = 1;

        while (tmp != null && next != null) {
            ListNode tt = next.next;
            next.next = tmp;
            tmp = next;
            next = tt;
            size++;
        }

        int[] result = new int[size];
        for (int i = 0; i < size; i++) {
            result[i] = tmp.val;
            tmp = tmp.next;
        }
        return result;
    }
}

反轉鏈表的經典操作

        ListNode tmp = head;
        ListNode next = tmp.next;
        tmp.next = null;
        while (tmp != null && next != null) {
            ListNode nn = next.next;
            next.next = tmp;
            tmp = next;
            next = nn;
        }

思路2

如果不允許修改鏈表,那么可以使用一個棧來存儲節點,然后先入后出,同時由棧可以想到遞歸,遞歸本身也是一個棧.

class Solution {

    public int[] reversePrint(ListNode head) {
        if (head == null) return new int[0];
        int size = 0;
        ListNode tmp = head;
        while(tmp != null) {
            size++;
            tmp = tmp.next;
        }
        int[] result = new int[size];
        // 開始遞歸
        tmp = head;
        recur(result, tmp, size - 1);
        return result;
    }

    private void recur(int[] result, ListNode node, int index) {
        if (node == null) return;
        recur(result, node.next, index - 1);
        result[index] = node.val;
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容