Java数据结构与算法基础(二)递归算法
Java数据结构与算法基础(一)概述与线性结构
学习目的:为了能更顺畅的读很多底层API代码和拓宽解决问题的思路
一、数据结构概述
1.数据结构是什么?数据与数据之间的关系
2.数据结构的分类:
存储结构分类:顺序结构和链式结构
逻辑结构分类:线性结构(除了首位元素,其他元素都存在前一元素和后一元素)、集合结构(集合)、树形结构(树结构、文件夹、文件结构)、图形结构(多对多结构)
二、算法概述
1.算法特性:输入(0或多个输入)、输出(一个输出)、有穷性(能出结果)、确定性(一一对应)、可行性(能解决问题)
2.算法的基本要求:正确性、可读性、健壮性、时间复杂度、空间复杂度
3.没有最好的算法,只有最适合的算法
三、线性结构
1.数组的基本概念与操作
① 存储结构:顺序方式存储
② 访问方式:数组名[下标],最大下标 = arr.length-1;
③ 元素默认值 = 0,赋值:数组名[下标] = value;
2.数组创建的时候就要指定长度(即数组长度不可变)
问题:如何解决数组长度不可变?如在数组末尾添加元素
解决:① 建一个新数组,长度 = oldArr.length+1;
② 复制旧数组元素到新数组,新数组的末尾元素 = 新元素;
③ oldArr = newArr
3.数组元素的删除(先告诉我删哪个元素)
① 建一个新数组,长度 = oldArr.length-1;
② 复制旧数组元素
newArr[i] = oldArr[i]; // i
③ oldArr = newArr;
4.面向对象的数组
属性(一个私有的数组)+方法(操作私有属性数组的方法)
要点:① 长度变化就意味着要建新数组,替代旧数组
② 传入下标的方法,首先都应该判断数组越界的问题
5.(数组)查找算法
线性查找:依次对比元素,找到相同元素即break
二分法查找:① 先排序,再查找
public static int binarySearch(int [] arr, int target){
if (arr == null) {
return -1;
}
int begin = 0;
int end = arr.length-1;
int mid = ((end - begin) >>> 1) + begin;
while(begin <= end){
if (arr[mid] == target) {
return mid;
}
if(arr[mid] > target){
end = mid-1;
}else if(arr[mid] < target){
begin = mid+1;
}
mid = ((end - begin) >>> 1) + begin;
}
return -1;
}
6.栈:先进后出
数组实现:入栈(建新数组,复制元素,新元素放到新数组最后,新数组替换对象旧数组属性)、出栈(建新数组,复制元素,取出最后一个元素,新数组替换对象中的旧数组属性,返回旧数组的最后一个元素)、查看栈元素(不涉及数组长度变化,所以直接返回旧数组的索引对应的值即可)
7.队列:先进先出
数组实现:入队、出队、队列是否为空(套路:建新数组主要涉及长度、复制元素、替换旧数组操作)
8.单链表:
存储形式:链式存储(存当前节点,同时存下个节点的位置[最后一个节点除外])
Java中单链表的结构:
Node:
int data;
Node next;
public Node(int data){
this.data = data;
}
涉及的操作:
通过第一个节点进行追加操作:
① 获取当前节点:Node currentNode = this;
② while(true){
获取下一个节点:Node next = currentNode.next;
如果下个节点为null,即最后一个节点:break;
否则:currentNode = next;
}
③ 追加节点到末尾:currentNode.next = node;//入参的Node
④ 返回当前节点 return this;
判断当前节点是否是最后一个节点:
判断当前节点的下一个节点是否为空即可
☆ 删除单链表的节点:取不到上个节点信息(这是问题),所以只能删除下个节点信息
① 取到下下个节点
② 将下下个节点赋值给当前节点的下个节点
显示所有节点信息:
① 打印当前节点信息
② currentNode = currentNode.next;
如果currentNode == null; break;
否则重复①~②
插入新节点:
① tempNode = currentNode.next;//作为下下个节点
② currentNode.next = node; //node 为新节点
③ node.next = tempNode;
9.循环链表:
结构:单链表的尾节点的下个节点是头结点
LoopNode{
int data;
LoopNode next = this;//默认自身是个循环链表,下个节点为其自身,插入节点操作和单链表相同
}
10.双向循环链表:
结构:包含上个节点信息、下个节点信息、当前节点内容
DoubleNode{
DoubleNode pre = this;
DoubleNode next = this;
int data;
}
主要操作:新增节点