leetcode 206. 反轉連結串列

海米傻傻發表於2024-06-18
題目描述
206. 反轉連結串列
給你單連結串列的頭節點 head ,請你反轉連結串列,並返回反轉後的連結串列。

示例 1:

輸入:head = [1,2,3,4,5]
輸出:[5,4,3,2,1]

示例 2:

輸入:head = [1,2]
輸出:[2,1]

示例 3:

輸入:head = []
輸出:[]



提示:連結串列中節點的數目範圍是 [0, 5000],-5000 <= Node.val <= 5000

進階:連結串列可以選用迭代或遞迴方式完成反轉。你能否用兩種方法解決這道題?

思路分析

迭代

時間複雜度O(n),空間複雜度O(1)

遞迴

時間複雜度O(n),空間複雜度O(n)

假設連結串列為 1→2→3→∅,我們想要把它改成 ∅←1←2←3

1. 在遍歷連結串列時,將當前節點 curr 的 next 指標改為指向前一個節點prev。

2. 由於節點沒有引用其前一個節點prev,因此必須事先儲存其前一個節點。

3. 在更改引用之前,還需要儲存後一個節點next。

4. 最後返回新的頭引用prev。

假設連結串列的其餘部分已經被反轉,現在應該如何反轉它前面的部分?

假設連結串列為:N(1)→N(2)→N(3)→…→N(k−1)→N(k)→N(k+1)→…→N(m)→∅

若從節點N(k+1)<span class="katex"><span class="katex-mathml"><span class="katex-html"><span class="base"><span class="strut"><span class="mord"><span class="mord mathnormal"><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight"><span class="mbin mtight"><span class="mord mtight"><span class="vlist-s"><span class="vlist-r"><span class="vlist">到<strong>N(m)</strong><span class="math math-inline"><span class="katex"><span class="katex-mathml"><span class="katex-html"><span class="base"><span class="strut"><span class="mord"><span class="mord mathnormal"><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight"><span class="vlist-s"><span class="vlist-r"><span class="vlist">已經被反轉,而我們正處於&nbsp;<span class="math math-inline"><span class="katex"><span class="katex-mathml">nkn_k<span class="katex-html"><span class="base"><span class="strut"><span class="mord"><span class="mord mathnormal">n<span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">k<span class="vlist-s">​<span class="vlist-r"><span class="vlist">。

k

n1→…→nk−1→nk→nk+1←…←nmn_1\rightarrow \ldots \rightarrow n_{k-1} \rightarrow n_k \rightarrow n_{k+1} \leftarrow \ldots \leftarrow n_mn
1

→…→n
k−1

→n
k

→n
k+1

←…←n
m

我們希望 nk+1n_{k+1}n
k+1

的下一個節點指向 nkn_kn
k

所以,nk.next.next=nkn_k.\textit{next}.\textit{next} = n_kn
k

.next.next=n
k

需要注意的是 n1n_1n
1

的下一個節點必須指向 ∅\varnothing∅。如果忽略了這一點,連結串列中可能會產生環。

作者:力扣官方題解
連結:https://leetcode.cn/problems/reverse-linked-list/solutions/551596/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
}

相關文章