鏈表遞歸針對力扣的203題來進行學習數組
首先咱們用鏈表解出來app
鏈表的建立代碼ide
package com.binglian.LinkedList.digui; public class ListNode { public int val; public ListNode next; public ListNode(int x){ val=x; } //鏈表節點的結構函數 //使用arr爲參數,建立一個鏈表,當前的ListNode爲鏈表頭爲節點 public ListNode(int[] arr){ if(arr ==null || arr.length ==0){ throw new IllegalArgumentException("建立鏈表的數據不能爲空"); } this.val=arr[0]; ListNode cur=this; for(int i=1;i<arr.length;i++){ cur.next=new ListNode(arr[i]); cur=cur.next; } } //以當前節點爲頭節點的鏈表信息字符串 @Override public String toString(){ StringBuilder res=new StringBuilder(); ListNode cur=this; while(cur !=null){ res.append(cur.val +"->"); cur=cur.next; } res.append("NULL"); return res.toString(); } }
這刪除內容其實和上一篇學習筆記刪除思路同樣函數
package com.binglian.LinkedList.digui; /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ public class Solution { public ListNode removeElements(ListNode head,int val){ while(head !=null && head.val ==val){//若是不爲空而且頭部爲val那麼就刪除 head.val 是指向的值 ListNode delNode=head; head=head.next; delNode.next=null; } if(head == null) return null; ListNode prev=head; while(prev.next !=null){ if(prev.next.val ==val){//判斷指向的值 是不是val 若是是 就刪除 ListNode delNode=prev.next; prev.next=delNode.next; delNode.next=null; }else { prev=prev.next;//若是值的內容都不是val 那麼指向下一個 } } return head; } public static void main(String[] args){ int[] nums={1,2,6,3,4,6}; ListNode head=new ListNode(nums); System.out.println(head); ListNode res=(new Solution()).removeElements(head, 6); System.out.println(res); } }
遞歸其實就是棧,把問題分紅若干個小問題學習
在鏈表中就是 一個頭結點後面鏈接了一個小鏈表動畫
遞歸其實和方法沒有多大區別,調用方法,又回到那個調用其餘方法的方法中,ui
就是棧,直到返回爲最基本問題的時候,而後在依次倒退,在倒退途中進行計算運行this
在視頻的圖,老師是一個很厲害的人,通俗易懂,到後面本身都大概理解,不像其餘老師,讓我雲裏霧裏的3d
鏈表的遞歸,和方法遞歸code
棧的代碼,
package com.binglian.LinkedList.digui; public class Sum { public static int sum(int[] arr){ return sum(arr,0); } //計算arr[l..n]這個區間內全部數組的和 private static int sum(int[] arr,int l){ if(l == arr.length)//出口、求解最基本問題 return 0; return arr[l]+sum(arr,l+1);//把原問題轉化成更小的問題 } public static void main(String[] args){ int[] nums={1,2,3,4,5,6,7,8}; } }
我先貼上203使用遞歸鏈表解決的代碼
package com.binglian.LinkedList.digui; /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ //使用遞歸進行編寫 public class Solution2 { public ListNode removeElements(ListNode head,int val){ if(head ==null) return null; ListNode res=removeElements(head.next, val); if(head.val== val) return res; else { head.next=res; return head; } } public static void main(String[] args){ int[] nums={1,2,6,3,4,6}; ListNode head=new ListNode(nums); System.out.println(head); ListNode res=(new Solution2()).removeElements(head, 6); System.out.println(res); } }
咱們在來看一下老師給的動畫,我分爲兩個部分,老師的代碼,簡潔了不少,我這裏沒有簡潔
個人理解就是,當回到最基本問題的時候,返回空,那麼程序就倒退,在執行語句,執行遞歸的下一個程序,而後一直回到最初調用的時候進行返回最終結果,,這只是個人理解,若是個人理解有問題,請評論在下方,小白的求知慾望
而後看回到最初的遞歸的下一個圖,