数据结构
从0开始, 由浅入深的学习Java数据结构
_大木_
所有的付出没有亏欠, 只为不负遇见.~
展开
-
Java之理解红黑树
文章目录红黑树(一棵特殊的自平衡的二叉查找树)红黑树的性质红黑树的玩法玩法介绍1. 红黑变色2. 左旋(向左转)3. 右旋(向右转)红黑树(一棵特殊的自平衡的二叉查找树)优化的二叉查找树, 用于高效的查找数据.红黑树的性质每个节点不是红色就是黑色根节点为黑色叶子节点为黑色不能出现连续的两个红色节点每个红色节点的两个子节点都是黑色插入节点默认是红色红黑树的玩法玩法介绍一个节点的父节点成为它的父亲一个节点的父节点的兄弟节点称为它的叔叔一个节点的父节点的父节点称为它的爷爷1.原创 2021-03-12 19:31:27 · 192 阅读 · 3 评论 -
Java 排序算法: 交换排序 (冒泡排序+快速排序)
文章目录内部排序的五大排序类型冒泡排序(BubbleSort) 及其改进冒泡排序规则:代码实现:冒泡排序 测试80000个随机数据的排序效率快速排序 (QuickSort)基本思想:快速排序 测试80000个随机数据的排序效率内部排序的五大排序类型插入排序交换排序冒泡排序快速排序选择排序归并排序基数排序冒泡排序(BubbleSort) 及其改进冒泡排序规则:一共进行 [数组大小 -1] 次的大循环每一趟大循环的里的小循环(即每一趟)在逐渐的减少[开始也是 数组大小-1原创 2021-01-24 15:30:21 · 134 阅读 · 3 评论 -
Java 递归实现迷宫回溯问题
使用递归回溯来给小球找路说明1. map 表示地图2. i,j 表示地图的哪个位置开始找 (1,1)3. 如果小球能找到, 表示小球到达 map[6][5]4. 约定: 当 map[i][j] 为0 表示该点没有走过, 当为1 表示强, 2 表示通路可以走; 3 表示该点已经走过, 但是走不通5. 在走迷宫前需要确定一个策略(方法): 下 -> 右 -> 上 -> 左, 如果该点走不通就回溯package com.beyond.recursion;public class原创 2021-01-21 01:36:51 · 262 阅读 · 6 评论 -
Java 后缀表达式实现计算器(逆波兰计算器)
逆波兰计算器的实现输入一个逆波兰表达式(后缀表达式), 使用栈(Stack), 计算其结果支持小括号和多位数整数, 因为这里我们主要针对于数据结构, 因此计算器进行简化, 只支持对整数的计算思路分析代码完成package com.beyond.stack;import java.util.ArrayList;import java.util.List;import java.util.Stack;public class PolandNotation { public stat原创 2021-01-01 19:16:44 · 425 阅读 · 1 评论 -
Java数据结构 利用数组模拟栈实现综合计算器
文章目录栈的核心简介栈的应用场景1. 子程序的调用:2. 处理递归调用3. 表达式的转换与求值4. 二叉树的遍历5. 图形的深度优先(depth-first)搜索利用数组模拟栈实现综合计算器栈的核心简介stack, 是一个先入后出(FILO-First In Last Out) 的有序列表, 是一个带限制的线性表,对于该表中的插入和删除只能在栈顶这一端进行, 而另一端为固定的一端, 称为栈底出栈使用 pop()入栈使用 push()栈的应用场景1. 子程序的调用:在跳往子程序前, 会向将下一个原创 2020-12-28 10:21:00 · 344 阅读 · 1 评论 -
Java 数据结构节点操作简化理解
节点操作简化理解a.next = b; 将a节点插在b节点的前面a.next = b.next; 将a节点插在b下一个节点的前面;a.pre = b ;将a节点插在b节点的后面a.pre = b.next; 将a节点插在b下一个节点的后面;a = a.next;a节点后移 (a节点移动到a.next节点)a = b ;将b节点信息赋值给a节点(即更新节点信息)(a节点移动到b节点)...原创 2020-12-28 08:26:00 · 430 阅读 · 1 评论 -
Java 之 内建 函数式接口
文章目录四类函数式编程接口(java.util.function)1. 功能型函数式接口: public interface Function四类函数式编程接口(java.util.function)1. 功能型函数式接口: public interface Function<T,R> { public R apply(T t) ; }package w.y;import java.util.function.Function;public class Demo { public st原创 2020-11-19 20:31:36 · 286 阅读 · 1 评论 -
JAVA实现: 使用单链表实现约瑟夫环(约瑟夫问题)
啥的原创 2020-11-19 18:32:01 · 759 阅读 · 4 评论 -
Java 实现数组折半查找(即 二分查找)(simple & low)
JAVA 实现数组二分查找前提: 数组必须先实现排序原理: 采用方法递归操作完成package w.y;public class Arraysort { public static void main(String[] args) { int array [] = new int[] {1,4,3,2,5,6,7,8} ; sortArray(array); show(array); int search = 8; System.out.println(binarySear原创 2020-11-12 22:09:48 · 309 阅读 · 1 评论 -
Java 实现数组冒泡排序 [Simple & Low]
package w.y;public class Arraysort { public static void main(String[] args) { int array_a [] = new int [] {3,4,1,8,5,7,6,2}; System.out.println("原数组:"); show(array_a); arraySort(array_a); System.out.println("冒泡排序后:"); show(array_a); } p原创 2020-11-11 21:44:50 · 314 阅读 · 1 评论 -
双链表的增删改查操作(java实现)
package com.beyond.doublelinkedlist;public class DoubleLinkedlistDemo { public static void main(String[] args) { System.out.println("双向链表的测试= ="); HeroNode2 a = new HeroNode2(1, "dhl", "beyond"); HeroNode2 d = new HeroNode2(4, "dhu", "beyond");原创 2020-11-08 10:27:04 · 285 阅读 · 1 评论 -
单链表的逆序输出: 逆序打印单链表
思路:方式一: 先将单链表进行反转操作, 然后再遍历即可, 这样做的问题是 会破坏原来的单链表结构, 不建议方式二: 可以利用栈这个数据结构, 将各个节点压入到栈中, 然后利用栈的先进后出的特点,实现逆序打印单链表 //方式二: 利用栈实现 单链表的逆序打印 public static void reversePrint(HeroNode head) { if (head.next == null) { return; } HeroNode temp = head.next;原创 2020-11-01 19:38:29 · 864 阅读 · 3 评论 -
JAVA实现单链表的反转
反转的思路遍历原链表的所有节点, 然后依次的插入到反转后链表的最前端.实现步骤:定义一个节点,用于保存反转后链表的首节点把原链表的首节点插入到反转后链表的最前面更新原链表和反转链表的首节点循环执行步骤2和步骤3,直到原链表中的首节点为null时停止 //链表的反转 /** * 遍历原链表的所有节点, 然后依次的插入到反转后链表的最前端. 实现步骤: 1. 定义一个节点,用于保存反转后链表的首节点 2. 把原链表的首节点插入到反转后链表的最前面 3. 更新原链表原创 2020-11-01 18:22:09 · 1253 阅读 · 4 评论 -
数据结构之循环链表的操作
文章目录1.单链表 Vs 循环单链表2.循环单链表的初始化和判空3.循环单链表的表尾节点判断4.循环双链表的基本操作(初始化,判空,判尾)5.循环双链表的插入操作5.循环双链表的删除操作1.单链表 Vs 循环单链表单链表: 表尾节点的next指针指向 NULL; 从一个节点出发只能找到后续的各个节点循环单链表: 表尾节点的next指针指向 头节点; 从一个节点出发可以找到其他任何一个节点2.循环单链表的初始化和判空#include<stdio.h>#include<stdl原创 2020-06-03 20:36:22 · 360 阅读 · 0 评论 -
数据结构之双链表的操作(C语言实现)
文章目录1. 单链表 Vs 双链表2. 双链表结构体3. 双链表的初始化(带头节点)4. 双链表的插入(带头节点)5. 双链表的删除和销毁(带头节点)6. 双链表的遍历(带头节点)后向遍历前向遍历前向遍历(跳过头节点)1. 单链表 Vs 双链表单链表:无法逆向检索, 有时候不太方便双链表:可进可退,存储密度更低2. 双链表结构体typedef struct DNode{ ElemType data; struct DNode *prior, *next;}DNode, *DLinklist;原创 2020-06-03 19:57:30 · 372 阅读 · 1 评论 -
数据结构之单链表的建立(带头节点)
核心是: 初始化操作, 指定节点的后插操作1. 头插法(时间复杂度为O(1))这里将尾插法的 r (尾)指针变为 头指针即可注意: 头插法插入数据后的链表是逆序的, 常常用于链表的逆置LinkList List_TailInsert(LinkList &L) { //正向建立单链表 int x; //设置 ElemType 为整型 L = (LinkList)malloc(sizeof(LNode)); //建立头节点 L->next = NULL; LNode *s; s原创 2020-05-24 18:55:26 · 756 阅读 · 1 评论 -
数据结构之单链表的查找(带头节点)
1. 按位查找(平均时间复杂度为O(n))GetElem(LinkList L, int i)返回第i个元素LNode * GetElem(LinkList L, int i){ if(i<0) return NULL; LNode *P; p = L; int j = 0; //当前p指向的第几个节点 while(p!=NULL && j< i){ p = p->next; j++; } return p;} 2. 按值查找(平均原创 2020-05-24 18:00:29 · 1336 阅读 · 1 评论 -
数据结构之单链表的插入删除操作
文章目录1.插入操作(注意审题)1.1 按位序插入带头结点(平均时间复杂度为O(n))1.2 按位序插入不带头节点(平均时间复杂度为O(n))1.3 指定节点的后插操作(时间复杂度 O(1))1.4 指定节点的前插操作1.4.1 第一种方式(找前驱节点,平均时间复杂度为O(n))1.4.2 第二种方式(仍然使用后插操作,然后交换节点数据, 时间复杂度为O(1))2.删除操作按位序删除(带头节点)(平均时间复杂度O(n))指定节点的删除第一种时间复杂度为O(n)第二种时间复杂度为O(1)1.插入操作(注意审原创 2020-05-23 16:50:52 · 2306 阅读 · 1 评论 -
数据结构之顺序表的查找操作(静态分配和动态分配实现)及其时间复杂度分析
文章目录1.按位查找(此时静态数组和指针数组的查找操作一致,但是分配空间申请操作时候必须强转为改指针数组类型)静态数组:动态分配时间复杂度2.按值查找动态分配方式时间复杂度1.按位查找(此时静态数组和指针数组的查找操作一致,但是分配空间申请操作时候必须强转为改指针数组类型)获取顺序表L中的第i个位置元素的值用数组下标即可得到第i个元素 L.data[i-1]静态数组:#include<stdio.h>#define MaxSize 5typedef struct { int原创 2020-05-22 16:32:42 · 1692 阅读 · 1 评论 -
数据结构之顺序表的插入删除操作(静态分配实现)及其时间复杂度分析
1.顺序表的插入操作插入元素的位置是i表示插入后,这个插入的元素是在 i 的位置, 即要先找到原先顺序表中i的位置所属元素, 插在此元素的前面即可#include<stdio.h>#define MaxSize 5typedef struct { int data[MaxSize]; //用静态数组存储当前数据 int length; //当前顺序表的长度} SqList;void InitList(SqList &L) { for(int i = 0; i<Ma原创 2020-05-20 16:41:53 · 12100 阅读 · 1 评论 -
数据结构之顺序表的动态分配操作
1. 使用 malloc 函数申请内存空间需要引入库函数:#include<stdlib.h>顺序表的实现------动态分配#include<stdio.h>#include<stdlib.h>#define InitSize 10 //默认的最大长度typedef struct{ int *data; //指示动态分配数组的指针 int length; //顺序表的当前长度 int MaxSize; //顺序表的最大容量}SeqList原创 2020-05-20 13:49:57 · 765 阅读 · 1 评论