java數據結構-鏈表遞歸(學習鏈表筆記三)

鏈表遞歸針對力扣的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);
	}
}

 

咱們在來看一下老師給的動畫,我分爲兩個部分,老師的代碼,簡潔了不少,我這裏沒有簡潔

個人理解就是,當回到最基本問題的時候,返回空,那麼程序就倒退,在執行語句,執行遞歸的下一個程序,而後一直回到最初調用的時候進行返回最終結果,,這只是個人理解,若是個人理解有問題,請評論在下方,小白的求知慾望

而後看回到最初的遞歸的下一個圖,