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">已經被反轉,而我們正處於 <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 我們希望 nk+1n_{k+1}n 所以,nk.next.next=nkn_k.\textit{next}.\textit{next} = n_kn 需要注意的是 n1n_1n 作者:力扣官方題解 |
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; } } |