日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

[Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]

發布時間:2023/12/10 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leetcode][第206题][JAVA][反转一个单链表][递归][迭代] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】[簡單]

【解答思路】

1. 遞歸 自底向上
  • 基本條件/終止條件:當前節點或者下一個節點==null

  • 遞推關系: head.next.next = head

在函數內部,改變節點的指向,也就是 head 的下一個節點指向 head 遞歸函數那句




時間復雜度:O(N) 空間復雜度:O(N)

class Solution {public ListNode reverseList(ListNode head) {//遞歸終止條件是當前為空,或者下一個節點為空if(head==null || head.next==null) {return head;}//這里的cur就是最后一個節點ListNode cur = reverseList(head.next);//這里請配合動畫演示理解//如果鏈表是 1->2->3->4->5,那么此時的cur就是5//而head是4,head的下一個是5,下下一個是空//所以head.next.next 就是5->4head.next.next = head;//防止鏈表循環,需要將head.next設置為空head.next = null;//每層遞歸函數都返回cur,也就是最后一個節點return cur;} }
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)

class Solution {public ListNode reverseList(ListNode head) {//申請節點,pre和 cur,pre指向nullListNode pre = null;ListNode cur = head;ListNode tmp = null;while(cur!=null) {//記錄當前節點的下一個節點tmp = cur.next;//然后將當前節點指向precur.next = pre;//pre和cur節點都前進一位pre = cur;cur = tmp;}return pre;} }

【總結】

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][反转一个单链表][递归][迭代]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。