数据结构(四)--链表和递归

本文探讨了链表数据结构及其与递归的结合应用。详细讲解了如何使用递归进行链表操作,包括删除特定节点以及通过打印输出展示递归调用的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)递归

递归:本质上,将原来的问题,转化为更小的问题
应用:数组求和
package cn.leetCode;

public class Sum {
	
	public static int sum(int[] arr){
		return sum(arr,0);
	}
	//计算arr[l..n)这个区间(从l到n-1)内所有数字的和,私有化
	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};
		System.out.println(sum(nums));
	}
}
控制台输出:36
分析:
//计算arr[l,n)范围里的数字和
public static int sum(int[] arr,int l){
	//求解最基本的问题
	if(l == arr.length){
	return 0;
	}
 //把原问题转化成更小的问题
return arr[l]+sum(arr,l+1);

}
递归(函数A中调用函数A与函数A中调用函数B没有本质区别,写程序时可以以第二种方式思考):
在进行递归调用时,就将调用的函数想成一个子函数,它具有一定的功能,至于具体功能如何实现,不用去细致追究
只要可以调用子函数的功能实现上层函数的功能就行
1.注意递归函数的"宏观"语义
2.递归函数就是一个函数,完成一个功能

(二)删除链表中某个节点

1.构建链表节点类
package cn.leetCode;
//此类为一个节点
public class ListNode {
	
	int val;
	ListNode next;
	ListNode(int x){
		val = x;
	}
	
	//链表节点的构造函数,构造以ListNode为头结点的链表
	//使用arr为参数,创建一个链表,当前的ListNode为链表的头结点
	public ListNode(int[] arr){
		if(arr == null || arr.length == 0){
			throw new IllegalArgumentException("arr can not be empty");
		}	
		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();
		//从自身开
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值