當前位置:
首頁 >
[Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]
發布時間:2023/12/10
48
豆豆
生活随笔
收集整理的這篇文章主要介紹了
[Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】[簡單]
【解答思路】
1. 遞歸 自底向上
-
基本條件/終止條件:當前節點或者下一個節點==null
-
遞推關系: head.next.next = head
在函數內部,改變節點的指向,也就是 head 的下一個節點指向 head 遞歸函數那句
時間復雜度:O(N) 空間復雜度:O(N)
2. 遞歸 自頂向下
- 尋找遞推關系
- 創建新函數,將「自底向上-范式」中的最終結果計算依賴的中間變量提取為函數的參數 -> prev為中間變量
- 尋找遞歸基本情況,跳出時返回基本情況的結果與中間變量的計算結果(最終結果) -> 遍歷完畢后,返回頭節點pre
- 根據函數參數與中間變量重新計算出新的中間變量 -> ListNode next = node.next;
- 修改參數 -> node.next = prev;(調轉方向 第一個指向了null)
- 遞歸調用并返回(該處的返回由基本情況條件觸發)-> reverse(node, next);
時間復雜度:O(N) 空間復雜度:O(N)
public ListNode reverseList(ListNode head) {return reverse(null, head);}public ListNode reverse(ListNode prev, ListNode node) {if (node == null) {return prev;}// logicListNode next = node.next; // node=1 next=2node.next = prev; // 1->null、2->1return reverse(node, next); // 1 2} class Solution {ListNode pre = null, tmp = null;public ListNode reverseList(ListNode head) {if (head == null)return pre;tmp = head.next;head.next = pre;pre = head;head = tmp;return reverseList(head);} }3. 雙指針 循環結構
- 第一個指針叫 pre,最初是指向 null 的。
- 第二個指針 cur 指向 head,然后不斷遍歷 cur。
- 每次迭代到 cur,都將 cur 的 next 指向 pre,然后 pre 和 cur 前進一位。
- 迭代完了(cur 變成 null 了),pre 就是最后一個節點了。
時間復雜度:O(N) 空間復雜度:O(1)
【總結】
1. 「自頂向下、自底向上、循環結構」三種方法完成
2.遞歸
在實現遞歸函數之前,有兩件重要的事情需要弄清楚:
遞推關系:一個問題的結果與其子問題的結果之間的關系。
基本情況:不需要進一步的遞歸調用就可以直接計算答案的情況??衫斫鉃檫f歸跳出條件。
一旦我們計算出以上兩個元素,再想要實現一個遞歸函數,就只需要根據遞推關系調用函數本身,直到其抵達基本情況。
3.遞歸模板套路
由下到上
參考鏈接:https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/
遞歸學習鏈接:https://blog.csdn.net/dadongwudi/article/details/107649161
總結
以上是生活随笔為你收集整理的[Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【GIT】使用Git命令窗口将本地工程提
- 下一篇: ListView中加入Button后,B