Java数据结构与算法
Java数据结构与算法
她的名字叫李承利
天道酬勤
展开
-
哈希表
1. 哈希表:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。因此哈希表最关键的两个问题就是,如何设计哈希函数,如何解决哈希冲突。2.原创 2022-02-17 14:11:22 · 216 阅读 · 0 评论 -
排序算法----堆排序
1. 堆排序:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。2. 二叉堆的定义:二叉堆是一颗完全二叉树,堆中的某个结点的值总是不大于父节点的值,通常这种堆称为最大堆(相应的可以定义最小堆)。下层的某一元素不一定小于上层的某一元素,既然是完全二叉树,所以可以用数组定义该结构。如图就是一个二叉堆:3. 堆中的节点关系:因为是通过数组进行存储的,所以节点的角标就对应数组原创 2022-02-17 13:51:36 · 301 阅读 · 0 评论 -
树形结构----Trie树
1. Trie树的定义:Trie树也叫字典树,单词查找树,是一种多叉树。专门处理字符串 查询每个条目的时间复杂度,和树中一共多少条目无关,其时间复杂度为O(w),w为所查询单词的长度,大多数单词的长度小于10(优势)。2. Trie树的实现://定义Trie树又称字典树 字典树是专门对字符串或字符进行操作的一种树 因此我们在定义是不需要再定义泛型/** 字典树的存储特点:根节点不存放数据 且字典树属一种多叉树 每个节点存放的是字符串或字符的一个字母 * 并且对字符串进行的是有序的存储 树中不原创 2022-02-16 17:51:38 · 164 阅读 · 0 评论 -
树形结构----优先队列
1. 优先队列的定义:普通队列是先进先出,后进后出。而优先队列的出队顺序和入队顺序无关,和优先级相关。因此优先队列可以通过最大堆在底层进行实现,但其本质还是队列。2. 优先队列的常见应用: 任务管理器中:动态选择优先级最高的任务执行;游戏中:塔防优先攻击(距离,威胁,先后)。3. 优先队列的实现://定义优先队列/** 优先队列是通过优先级高低来入对 出队等操作的* 因此我们底层使用最大堆来实现优先队列* 父节点的优先级必须大于左右子节点的优先级*/public class Pri原创 2022-02-16 17:47:11 · 3321 阅读 · 0 评论 -
树形结构----最大堆
1. 最大堆的定义:二叉堆是一颗完全二叉树( 区别于满二叉树 ),堆中某个结点的值总是不大于其父节点的值,通常这种堆称为最大堆( 相应的可以定义最小堆 )。下层的某一元素不一定小于上层的某一元素。2. 最大堆的存储结构:既然是完全二叉树,所以可以用数组定义该结构。如图就是一个最大堆:3. 最大堆中的节点关系:因为是通过数组进行存储的,所以节点的角标就对应数组中的角标。1>. 父节点角标:( 子节点角标 - 1 ) / 2。即" parent = ( i - 1 ) / ...原创 2022-02-16 17:39:32 · 592 阅读 · 0 评论 -
树形结构----AVL平衡树实现映射
1. AVL平衡树的介绍:AVL平衡树是由G.M.Adelson-Velsky和E.M.Landis两人创建,因此命名为AVL。AVL平衡树是一种最早的自平衡二分搜索树结构,满二叉树一定是平衡二叉树,高度最低;完全二叉树也是平衡二叉树。2. AVL平衡树的定义:对于AVL平衡树而言,其任意一个节点,左子树和右子树的高度差都不能超过1。3. AVL平衡树的平衡因子:节点的左右子树的高度差。4. AVL平衡树的调整:当向树中添加或删除节点时,会对树的结构发生改变,因此就需要进行平衡调整。5. 平原创 2022-02-14 16:56:54 · 363 阅读 · 0 评论 -
二分搜索树与映射
1. 映射的定义:映射就是存储( 键,值 )数据对的数据结构( Key,Value ) , 根据键(Key),寻找值(Value), 可以由链表实现映射LinkedMap ,是有序的;也可以由二分搜索树实现映射TreeMap,是有序的,并且键自然排序。映射中的键具有唯一性,不能重复;而键对应的值可以重复。2. 映射接口的定义:public interface Map<K, V> { //向map中添加键值对 public void put(K key, V value);原创 2022-02-13 20:48:58 · 84 阅读 · 0 评论 -
二分搜索树与集合
1. 集合的定义:集合用于存储不重复元素的容器,可以由链表实现LinkedSet,是有序的,也可以由二分搜索树实现TreeSet是有序,自然排序。2. 集合set接口的定义:public interface Set<E> extends Iterable<E>{ //向集合中添加元素 public void add(E element); //删除集合中指定元素 public void remove(E element); //判断集合中是否包含指定元素 pub原创 2022-02-13 20:37:59 · 235 阅读 · 0 评论 -
树形结构----二分搜索树
1. 二分搜索树的定义:二分搜索树本身是二叉树,只不过对于二分搜索树的每个结点而言,大于其左子树的所有结点的值,小于其右子树的所有结点的值。同样,其子树也是一颗二分搜索树,那么该树中元素必须要具有可比性,并且不包含重复元素。如图就是一颗二分搜索树:2. 二分搜索树数据结构的实现:包括二分搜索树中数据的增删改查,二分搜索树的遍历(前中后序遍历,及层序遍历的迭代和递归方式 )等方法。//二分搜索数的定义 /* * 二分搜索数的特点:任意根节点的右子树所有节点又要小于根节点 左子树节点所有.原创 2022-02-13 20:29:12 · 258 阅读 · 0 评论 -
树形结构----二叉树
1. 二叉树的定义:二叉树( Binary Tree )是n( n≥0 )个结点的有限集合,该集合或者空集( 称为空二叉树 ),或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成。例如:图中就是一颗二叉树。2. 二叉树的特点: 1>. 每个结点最多有两棵子树。 2>. 左子树和右子树是有顺序的。 3>. 即使树中某结点只有一棵子树,也要区分左右。3. 二叉树的特殊情况: 1&g...原创 2022-02-13 20:12:50 · 457 阅读 · 0 评论 -
树形结构定义
1. 树的定义:树( Tree )是n( n≥0 )个结点的有限集。当n=0时称为空树。在任意一颗非空树中: 1>. 有且仅有一个特定的称为根(root)的结点。2>. 当n>1时,其余结点可分为m( m>0 )个互不相交的有限集T1、T2、……、Tm,其中每一个集合本身又是一颗树,并且称为根的子树( SubTree )。例如:2. 树节点的分类:结点拥有的子树数量称为结点的度。度为0的结点称为叶节点或终端结点;度不为0的结点称为非终...原创 2022-02-13 19:32:29 · 439 阅读 · 0 评论 -
查找算法----插值查找
1. 插值查找:在介绍插值查找之前,首先考虑一个新问题,为什么上述算法一定要是折半,而不是折四分之一或者折更多呢?打个比方,在英文字典里面查“apple”,你下意识翻开字典是翻前面的书页还是后面的书页呢?如果再让你查“zoo”,你又怎么查?很显然,这里你绝对不 会从中间开始查起,而是有一定目的的往前或往后翻。同样的,比如要在取值范围1~10000之间100个元素从小到大均匀分布的数组中查找5,我们自然会考虑从。数组下标较小的开始查找。经过以上分析,折半查找这种查找方式,不是自适应的(也就是...原创 2022-02-12 16:21:20 · 700 阅读 · 0 评论 -
查找算法----斐波那契查找
1. 斐波那契查找:斐波那契搜索也是二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。 同样地,斐波那契查找也属于一种有序查找算法,必须在有序的结构中才能进行查找。 斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。2. 斐波那契查找的时间复杂度:斐波那契查找的时间复杂度为O( logn )。3. 斐波那契查找的实现://查找算法 斐波那契查找 该查找方法的效率要低于插入查找的效率但是高于二分查找的效率//查找效率:插入查找 &原创 2022-02-12 15:17:28 · 644 阅读 · 0 评论 -
查找算法----二分查找
1. 二分查找:二分查找又称折半查找,二分搜索,折半搜索等。二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间。但它有一个前提,就是必须在有序数据中进行查找。2. 二分查找的时间复杂度:二分查找的时间复杂度为O( logn )。3. 二分查找的实现://查找算法 二分查找 时间复杂度为:O(logn)//该方式是一种非自适应的查找方式 二分查找的效率比顺序查找的效率高//查找效率:插入查找 > 斐波那契查找 > 二分查找 > 顺序查原创 2022-02-12 15:09:18 · 208 阅读 · 0 评论 -
查找算法----顺序查找
1. 顺序查找:顺序查找又称顺序查找或者线性查找。顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法。对于任意一个序列以及一个给定的元素,将给定元素与序列中元素依次比较,直到找出与给定关键字相同的元素,或者将序列中的元素与其都比较完为止。2. 顺序查找的时间复杂度:顺序查找的时间复杂度为O( n )。3. 顺序查找的实现://查找算法 顺序(线性)查找 时间复杂度为:O(n)//该方式是一种非自适应的查找方式 顺序查找的效率最低//查找效率:插入查找 > 斐波那契查找 .原创 2022-02-12 15:02:30 · 616 阅读 · 0 评论 -
排序算法----计数排序
1. 计数排序:计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。2. 计数排序的时间,空间复杂度及稳定性: 1>. 时间复杂度:O(n+m)。 2>. 空间复杂度:O(n+m)。 3>. 稳定性:稳定。3. 计数排序的实现://计数排序 即记录数组中数据出现的次数/* * 将数组中数据出现的次数放入...原创 2022-02-11 12:06:33 · 390 阅读 · 0 评论 -
排序算法----桶排序
1. 桶排序:桶排序是基数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序( 有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排 )。2. 桶排序的时间,空间复杂度及稳定性: 1>. 时间复杂度:O(n+m) 。 2>. 空间复杂度:O(n+m)。 3>. 稳定性:稳定。3. 桶排序的实现://桶排...原创 2022-02-10 17:57:45 · 522 阅读 · 0 评论 -
排序算法----基数排序
1. 基数排序:基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。2. 基数排序的时间,空间复杂度及稳定性:1>. 时间复杂度:O(n+m)。2>. 空间复杂度:S(n+m)。 3>. 稳定性:稳定。3. 基数排序的实现://基数排序/* * 基数排...原创 2022-02-10 17:39:15 · 694 阅读 · 0 评论 -
排序算法----三路快速排序
1. 快速排序:快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比一部分的关键字小,比另一部分的关键字大,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2. 三路快速排序的时间,空间复杂度及稳定性:1>. 时间复杂度:O(nlogn);因为我们这里三路快速排序的过程中向下递归分割数组的过程时间复杂度为:O(logn);我们在划分数组部分的时候还要遍历数组,时间复杂度为:O(n);因此三路快速排序的时间复杂度为:O(nlogn)。...原创 2022-02-10 17:31:15 · 1833 阅读 · 0 评论 -
排序算法----双路快速排序
1. 快速排序:快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比一部分的关键字小,比另一部分的关键字大,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2. 双路快速排序的时间,空间复杂度及稳定性:1>. 时间复杂度:O(nlogn);因为我们这里双路快速排序的过程中向下递归分割数组的过程时间复杂度为:O(logn);我们在划分数组部分的时候还要遍历数组,时间复杂度为:O(n);因此双路快速排序的时间复杂度为:O(nlogn)。...原创 2022-02-10 17:25:13 · 712 阅读 · 0 评论 -
排序算法----单路快速排序
1. 快速排序:快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,比另一部分的关键字大,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2.单路快速排序的时间,空间复杂度及稳定性: 1>. 时间复杂度:O(nlogn);因为我们这里单路快速排序的过程中向下递归分割数组的过程时间复杂度为:O(logn);我们在划分数组部分的时候还要遍历数组,时间复杂度为:O(n);因此单路快速排序的时间复杂度为:O(nlogn)。...原创 2022-01-23 14:37:17 · 326 阅读 · 0 评论 -
排序算法----归并排序
1. 归并排序:归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2路归并。2. 归并排序的时间,空间复杂度及稳定性: 1>. 时间复杂度:O(nlogn);因为我们这里归并排序的过程中向下递归二分数组时的时间复杂度为O(logn);但是再向上并的过程中,还会遍历原数组,时间复杂度为:O(n);因此归并排序的时间复杂度为:O...原创 2022-01-23 14:29:06 · 562 阅读 · 0 评论 -
排序算法----希尔排序
1. 希尔排序:1959年Shell发明,第一个突破O(n^2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。2.希尔排序的时间,空间复杂度及稳定性:1>. 时间复杂度:O(n^1.3);虽然我们这里希尔排序的过程中会出现了三层循环的嵌套,但是通过某些算法最后计算得出希尔排序的时间复杂度为O(n^1.3)。 2>. 空间复杂度:S(1);因为我们在希尔排序时是对原数组进行直接排序,...原创 2022-01-23 14:19:42 · 1907 阅读 · 0 评论 -
排序算法----冒泡排序
1. 冒泡排序:冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。2. 冒泡排序的时间,空间复杂度及稳定性: 1>. 时间复杂度:O(n^2);因为我们这里冒泡排序的过程中会出现两层循环的嵌套。2>. 空间复杂度:O(1);因为我们在冒泡排序时是对原数组...原创 2022-01-23 14:01:14 · 488 阅读 · 0 评论 -
排序算法----选择排序
1. 排序算法:就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 1>. 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 比较类排包含:选择排序、冒泡排序、插入排序、希尔排序、归并排序、堆排序、快速排序。 2>. 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。非比较类排序包...原创 2022-01-23 13:49:40 · 346 阅读 · 0 评论 -
分治回溯算法----棋盘覆盖问题
棋盘覆盖问题:在一个2^k×2^k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有4^k种,因而有4^k种不同的棋盘。棋盘覆盖问题要求用4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。如图:以4*4的棋盘为例:四种不同形状的L型骨牌:骨牌覆盖的结果:棋盘填充的实现://分治回溯 分治的应用 之 棋盘覆盖问题/*利用分治算法 将棋盘分成三个子棋盘首先要先判断特殊方.原创 2022-01-21 11:04:57 · 287 阅读 · 0 评论 -
分治回溯算法----数独问题
数独问题:使一个9*9的矩阵中,每一行、每一列、每一个九宫格( 即3*3矩阵 )内的数字均含1-9中的数字,且每一行、每一列、每一个九宫格( 即3*3矩阵 )内的数字不能重复。如同所示就是一个数独问题的矩阵,我们要将矩阵中的空白位置填入符合条件的1-9的数字。//数独文件 其中写的就是数独矩阵005300000800000020070010500400005300010070006003200080060500009004000030000009700//分治回溯 回溯原创 2022-01-21 11:00:10 · 509 阅读 · 0 评论 -
分治回溯算法----八皇后问题
八皇后问题:在一个8×8的棋盘中,放入8个皇后棋子,要求同行同列同斜线不能有重复的皇后棋子,八皇后问题一共有92种解法。如图所示:即八皇后问题的一个解。//分治回溯算法解决八皇后问题public class NQueen { private static int count = 0; //表示第count个解 private static int N = 8; //表示N皇后 也表示矩阵的尺寸 private static int[][] arr = new int[原创 2022-01-21 10:49:28 · 554 阅读 · 0 评论 -
分治回溯算法----迷宫问题
迷宫问题:如图所示,在一个迷宫中从入口到出口前进按照方向的先后顺序寻找到一条出路。该图中灰色的格子表示是迷宫中的墙,白色的格子表示迷宫中的路。//分治回溯算法解决解决迷宫出路问题public class Maze { //以一个二维数组表示迷宫 1表示是墙走不通 0表示是路可以走通 private static int[][] maze = { {1, 1, 1, 1, 1, 1, 1, 1, 1}, {0, 0, 1, 0, 0,原创 2022-01-21 10:39:35 · 440 阅读 · 0 评论 -
分治回溯算法----汉诺塔问题
汉诺塔问题:汉诺塔问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。如图:以三个盘子为例的移动过程://分治回溯算法解决汉诺塔问题/*要将第n个盘子从begin经过mid移到end就要将前n-1个盘子从begin经过eng移到mid...原创 2022-01-21 10:25:12 · 703 阅读 · 0 评论 -
分治回溯算法----全排列问题
全排列问题:如,求解字符串“ABC”中所有字符的全排列( 不包含重复 ),该问题的解为:ABC ACB BAC BCA CAB CBA。//分治回溯算法解决全排列问题 不得重复public class FullPermutation { public static void main(String[] args) { String str = "ABC"; char[] arr = str.toCharArray(); ...原创 2022-01-21 09:57:48 · 549 阅读 · 0 评论 -
分治回溯算法
一. 1. 分治回溯算法--分治算法:分治算法就是将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。 2. 分治算法的递归实现中,每一层递归都会涉及这样三个操作:1>. 分解:将原问题分解成一系列子问题。2>. 解决:递归地求解各个子问题,若子问题足够小,则直接求解。...原创 2022-01-21 09:44:49 · 499 阅读 · 0 评论 -
动态链表----双向循环链表的实现
1. 双向循环链表的定义:双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。如图:2. 双向循环链表不只可以实现线性表List,也可以实现队列,双端队列,栈这些数据结构。因此我们在实现双端循环链表时,使其实现List,Queue,DoubleQueue,Stack这些接口。//双向循环链表 即可以实现列表List的方法 也可以实现双端循环队列D原创 2022-01-17 11:42:35 · 438 阅读 · 0 评论 -
动态链表单向循环链表的应用----逢七过游戏的实现
1. 逢七过游戏简介:好友围坐在酒桌前,从任意一人开始轮流报数,数字从1开始。 凡是遇到任何7的倍数,如14、21或含7的数字如17、27均喊“过”。 遇到反应慢了没有敲zhi打桌面的人则失败。失败的惩罚就是罚酒或者表演节目。 接下来,被惩罚过的人重新开始报数,可以从10以下任意一个数字开始。2.逢七过游戏的实现://逢七过游戏/*输入玩家的个数输入从哪个玩家开始输入该玩家从哪个数字开始输入一共玩几个数字打印出每个玩家将要报出的所有数字*/public class SevenGa.原创 2022-01-17 11:36:07 · 2076 阅读 · 0 评论 -
动态链表单向循环链表的应用----约瑟夫环问题的实现
1. 约瑟夫环介绍:据说著名犹太历史学家Josephus有过一下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲在一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3个人该人必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在了第16个与第31个位置,于是逃过了这场死亡游戏。2. 约瑟夫环问题的实原创 2022-01-17 11:31:30 · 2360 阅读 · 0 评论 -
动态链表----单向循环链表的实现
1. 单向循环链表的定义:如果把单链表的最后一个节点的指针指向链表头部,而不是指向null,那么就构成了一个单向循环链表。如图:2. 单向循环链表的实现:单向循环链表实现与单向链表的实现相似,同样是实现线性表List的接口。//单向循环链表的实现public class LinkedSinglyCircularList<E> implements List<E> { /*将数据封装成节点 节点包括两部分 数据域和指针域 数据域中存放的是数据内容 .原创 2022-01-17 11:24:54 · 447 阅读 · 0 评论 -
动态链表----单向链表的实现
1. 单向链表的定义:单向链表就是线性结构链式存储方式的具体实现,简称为:单链表。2. 单向链表的实现:单向链表的方法与线性表的方法相似,因此我们可以使单向链表实现线性表List的接口。//单向链表的实现public class LinkedSinglyList<E> implements List<E> { /*将数据封装成节点 节点包括两部分 数据域和指针域 数据域中存放的是数据内容 指针域中存放的是当前节点的下一跳节点的地址 即指针域指向当原创 2022-01-17 11:19:50 · 181 阅读 · 0 评论 -
链式存储--动态链表
1. 动态链表的定义:2. 动态链表的头节点:头结点是指链表中的第一个结点,有真实头结点和虚拟头结点之分。 1>.真实头结点:其第一个结点用于存储数据。 2>. 虚拟头结点:其第一个结点不许存储数据。3. 动态链表的头指针( 如:head ):仅仅是一个引用变量,存储头结点地址的指针而已。4. 动态链表的尾指针( 如:tail ):同头指针,不过是链表中最后一个结点的指针而已。...原创 2022-01-17 11:09:10 · 653 阅读 · 0 评论 -
动态数组----双端循环队列的实现
1. 双端循环的定义:双端循环队列是限定插入和删除操作在表的两端进行的线性表,是一种具有队列和栈的性质的数据结构。2. 双端循环队列接口的定义:双端循环队列大致思想与循环队列一样,无非在队首可添加可删除,在队尾也可添加可删除。public interface DoubleLoopQueue<E> extends Queue<E> { //向双端循环队列的队首添加元素 public void addFirst(E element); //向双端循环队列原创 2022-01-14 13:46:25 · 299 阅读 · 0 评论 -
动态数组----循环队列的实现
1. 引入循环队列的原因:普通队列的出队时间复杂度O(n),不是按平均算的,因为每次出队都是O(n)。因此我们为了降低出队的时间复杂度,我们可以定义一个循环队列来实现队列的操作。2. 循环队列的特点:即当队尾或队头指针到达尾部时,如需后移可重新指向表头。如图:其中front表示队头指针,rear表示队尾指针。注意:我们在定义循环队列时会预留出一个空的位置,是尾指针rear始终指向这个空的空间,这样就会避免队满和队空条件一样的问题。避免了二异性。3. 循环队列的接口:其中只定义一些循环队列操作原创 2022-01-14 13:33:51 · 323 阅读 · 0 评论