反轉鏈表(206)

1.雙指針法

1.1 解題思路

1.我們可以申請兩個指針,第一個指針叫 prev,最初是指向 null 的。
2.第二個指針 curr 指向 head,然後不斷遍歷 curr。
3.每次迭代到 curr,都將 curr 的 next 指向 prev,然後 prev 和 curr 前進一位。
4.都迭代完了(curr 變成 null),prev 就是最後一個節點了。

1.2 代碼思路

 /**
     * 雙指針迭代
     * 我們可以申請兩個指針,第一個指針叫 pre,最初是指向 null 的。
     * 第二個指針 cur 指向 head,然後不斷遍歷 cur。
     * 每次迭代到 cur,都將 cur 的 next 指向 pre,然後 pre 和 cur 前進一位。
     * 都迭代完了(cur 變成 null 了),pre 就是最後一個節點了。
     *
     * @param head
     * @return 鏈表
     */
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode prev = null;
        ListNode curr = head;
        while(curr != null){
            ListNode tempNode = curr.next;
            curr.next = prev;
            prev = curr;
            curr = tempNode;
        }
        return prev;
    }

在這裏插入圖片描述
1.3 複雜度分析

 時間複雜度: O(n),假設 n 是列表的長度,時間複雜度是 O(n)。
 空間複雜度: O(1)

2.遞歸

2.1 解題思路

終止條件是當前節點或者下一個節點==null
在函數內部,改變節點的指向,也就是 head 的下一個節點指向 head 
遞歸函數那句head.next.next = head

2.2 代碼思路

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
2.3複雜度分析

時間複雜度:O(n),假設 n是列表的長度,那麼時間複雜度爲 O(n)。
空間複雜度:O(n),由於使用遞歸,將會使用隱式棧空間。遞歸深度可能會達到 n 層。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章