(一)递归
递归:本质上,将原来的问题,转化为更小的问题
应用:数组求和
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();
//从自身开