数据结构与算法
文章平均质量分 52
基本数据结构与操作
XYX的Blog
太原理工大学
展开
-
Day01-数据结构-顺序线性表(C语言)
因为在函数中需要删除线性表的元素,而不是通过值传递,这样才可以在main函数中显示最终的修改结果。若只用SqList L,就只会在函数中修改,main函数中不能显示修改后结果。线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素。1.线性表:零个或多个数据元素的有限序列。为什么要传参的时候传递指针变量?函数中, 声明指针类型。2.线性表的抽象数据类型。3.线性表的顺序存储结构。原创 2023-08-30 20:23:52 · 105 阅读 · 1 评论 -
Day02 链式存储结构(C语言)
为了表示每个数据元素a与其直接后继数据元素ai+1之间的逻辑关系,对数据元素a来说除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。这两部分信息组成数据元素ai的存储映像,称为结点(Node)。头节点:为统一操作方便而设立,放在第一个元素的节点之前,其数据域一般无意义(非必要)头指针:链表指向第一个节点的指针,若有头节点则指向头节点(必要)尾节点:线性链表的最后一个节点指针指向为NULL。原创 2023-09-04 21:18:51 · 267 阅读 · 1 评论 -
03-SinglyLinkedList-单链表(C/Java)
基于C语言和Java实现单链表的操作原创 2023-09-11 20:06:34 · 103 阅读 · 0 评论 -
04-链表-哨兵节点/头节点/头指针
在学习链表时,一定要区分清楚有关哨兵节点,头节点,头指针基本概念哨兵节点(Sentinel Node)、头节点(Head Node)和头指针(Head Pointer)是常用的概念,它们在数据结构中有不同的作用和含义。----哨兵节点哨兵节点(Sentinel Node):哨兵节点是一种特殊节点,它在链表或树等数据结构中用于简化边界情况的处理。通常哨兵节点的值或内容是无效的,它并不存储有效数据。哨兵节点可以帮助简化一些操作,如在链表中插入节点时不需要特别处理空链表和非空链表的情况。---- 头节点。原创 2023-09-12 17:40:11 · 1115 阅读 · 0 评论 -
019.删除链表的倒数第N个节点(Java/C)
首先遍历链表获取节点个数,然后计算倒数第 n 个节点的位置。如果要删除的是头节点,直接将头指针指向下一个节点。然后再次遍历链表,找到待删除节点的前一个节点,进行删除操作。最后返回修改后的链表头。综上,如果设置两个节点,间距为(n+1)个节点,从头遍历,逐次保持间距遍历链表,便可满足需求。1.如果要想删除节点,必须要找到被删除节点的上一个节点 ——> 设置哨兵节点。1.要删除的节点之后n个节点为null,即链表结束,可作为一个终止条件。2.此时,如果有一个指针指向删除链表节点的前一个节点,便可以完成删除。原创 2023-09-17 17:17:53 · 290 阅读 · 1 评论 -
021.合并有序链表(Java/C/链表易错点)
在Java中的指针不是只传1个节点,它是传此节点后的所以节点,这往往就要考虑到操作步骤的顺序问题,尤其是节点的更新是否为想要更新的节点。思路总体:通过用指针遍历List1和List2,比较其值的大小,进而将遍历后满足升序的结果放入List3集合中。3.当链表1的值等于链表2的值,将链表1和链表的节点放入List3中,更新List1,List2。1.当链表1的值小于链表2的值,将链表1的节点放入List3中,更新List1。2.当链表2的值小于链表1的值,将链表1的节点放入List3中,更新List2。原创 2023-09-19 18:30:45 · 71 阅读 · 2 评论 -
024.两两交换链表的节点(Java/C)
难点:如何确保链表在两两交换节点后,仍然相连。所以链表的操作必须保持在统一链表上操作,而不是把链表切割再重新组装。核心思路:若想交换相邻两个节点,必须找到要交换的第一个节点的前一个节点。将上述代码用递归进行重新书写,可以减少空间复杂度。原创 2023-09-16 19:39:34 · 75 阅读 · 1 评论 -
203. 移除链表元素(Java/C)
的节点时,通过修正指针的引用关系进行节点删除操作,否则,继续遍历下一个节点。最后,返回处理完成的链表头节点。的节点,返回处理结果(链表头节点)。方法一:通过哨兵节点作为中间,不断遍历筛选。指针配合遍历链表,当遇到值等于。指针,直到找到第一个值不等于。通过遍历链表,删除值为。原创 2023-09-14 11:47:05 · 116 阅读 · 1 评论 -
206.反转链表(Java/C)三种解法
同时,递归算法要注意避免出现无限递归的情况,因此通常需要设置递归深度限制或者其他终止条件。存储的是当前层递归调用返回的子链表反转后的头节点。通过这种方式,我们可以在每一次递归调用时保存子链表反转后的头节点,并将其与当前节点进行连接操作。的作用是临时存储递归调用返回的子链表反转的结果,以便正确地进行链表节点的连接。是一个临时变量,用于存储递归调用返回的反转后的子链表的头节点。的返回值,即以当前节点的下一个节点为头节点的子链表的反转结果。的作用是为了保留这个反转后的子链表的头节点,以便将其与当前节点。原创 2023-09-15 12:11:12 · 182 阅读 · 0 评论 -
Day11-队列的链表实现(C/Java)
队列(Queue)是一种常见的数据结构,它按照先进先出(FIFO)的原则存储元素。队列有两个主要操作,即入队(enqueue)和出队(dequeue)。入队操作将一个元素添加到队列的末尾,而出队操作则从队列的前端移除并返回队列中的第一个元素。队列可以比喻成排队等待服务的人群,新来的人加入队尾,而被服务结束的人从队头离开。这种结构在很多实际场景中都有应用,比如计算机执行任务的排队调度、网络数据传输的缓存控制等。原创 2023-09-22 22:16:27 · 172 阅读 · 1 评论 -
Day12-环形数组实现队列(C/Java)
虽然数组在实现队列入栈时,可以通过变换索引的值来实现,但当出栈时会造成队列假溢出的问题或者要考虑数组移动,造成内存的浪费,性能较差,所以通过环形数组可以很好的解决这一问题。1.对比普通数组,队列在确定头指针和尾指针时更加自由,不需要考虑数据的移动。因为数组为环形,必然存在索引的重新排布,即末尾索引值到索引为0的跨越。当((tail索引 + 1)% 数组长度)与head索引的值相同。2.环形意味着不需要考虑数组的越界问题。当tail索引与head索引的值相同。原创 2023-09-25 18:50:01 · 64 阅读 · 1 评论 -
Day13-栈的实现(Java/C/链栈和顺序栈)
*栈(stack):**是限定仅在表尾进行插入和删除操作的线性表。**属性:**我们把允许插入和删除的一端称为栈顶(top)另一端称为底(bottom)不含任何数据元素的栈称为空栈。栈又称为后进先出(LastInFirstOut)的线性表简称LIFO结构。原创 2023-09-26 20:01:30 · 79 阅读 · 1 评论 -
020.有效的括号(栈的应用)
比较上述两种方法,在时间复杂度和空间复杂度几乎相同,但方法二可以很快处理字符串中第一个元素为 ].),} 的情况,在某些情况下,可以很快处理此问题,方法一也可以通过加入一个flag去判断此情况,但空间复杂度会相应增加,大家按需选取。当遍历到(,{,[ 时将其与之相对的 ),},] 进行入栈操作,当遍历到),},] 时若与栈顶元素相同,则将栈顶元素弹出,当栈为空时,表示匹配完成。当为(,{,[ 时将其入栈,当遍历到与之匹配的括号,将栈内元素弹出,当栈为空时,则全部为有效括号。原创 2023-09-26 20:19:50 · 150 阅读 · 1 评论 -
083.删除排序链表中重复的元素(双指针法/Java/C)
由于在去重的过程中需要考虑重复节点的上一个节点,以此来保证链表的连续性,因此采用双指针放比较合适。1)通过重复节点前一个节点和去重后的最后一个节点定义双指针。2)指针相邻,比较值。值相等去重,值不等一起前进。原创 2023-09-18 18:12:37 · 166 阅读 · 0 评论 -
LeetCode150 一般表达式和后缀表达式(Java)
逆波兰表示法是一种数学表达式的书写和计算方法。它不使用括号来表示优先级,而是通过将操作符放在操作数的后面来确定优先级。在逆波兰表示法中,操作符放在操作数的后面。例如,表达式 “2 + 3” 在逆波兰表示法中写作 “2 3 +”。计算该表达式时,先将操作数 2 和 3 进行相加,结果为 5。然而对于一般表达式,应该如何转换成后缀表达式呢?这符合栈的特点,所以通过栈来处理此题。原创 2023-10-07 21:41:43 · 58 阅读 · 1 评论 -
LeetCode239 滑动窗口最大值(Java)
单调队列:一种特殊的队列数据结构,它在队列的基础上增加了一个单调性的要求。它的主要特点是队列中的元素按照一定的顺序排列,可以保持队列中的元素按照递增或递减的顺序排列。通过分析可以发现,内层循环是一个固定大小的循环,每次循环需要比较窗口大小的元素。入队,这样不难看出,队头元素则为最大元素,这与题目如出一折,而且每次只要移动依次窗口,便可知道窗口内的最大值,所以时间复杂度只有O(n),这样就不会出现超时的问题。所以不出意外,会出现超出时间限制的问题,所以只能另辟蹊径。入队时,会将4,3,2出队,再将。原创 2023-10-08 19:21:51 · 65 阅读 · 1 评论 -
Day14-二叉树的创建与初始化(Java/C)
树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集Ti、T2、······、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。原创 2023-10-14 20:16:27 · 233 阅读 · 1 评论 -
Day15-二叉树的前,中,后序遍历(递归/非递归)
【代码】Day15-二叉树的前,中,后序遍历(递归/非递归)原创 2023-10-14 21:30:03 · 50 阅读 · 1 评论 -
101.对称二叉树(Java/递归细节)
*题目易错点:**很多同学在写的时候只考虑到二叉树的值是否相等,通过中序遍历,与返回字符串的值是否为回文做判断,导致忽略了二叉树的结构。要想要树对称,需要分析各个节点在什么情况下是对称的:这几将树分为左子树和右子树,同时比较对称位置上的节点情况,即每次比较两个节点。3.当左右孩子均存在,便可以比较同为内侧或同为外侧的两个孩子的值是否相同,如果不同则不相等,如果相同则继续遍历节点看是否满足条件。**题目解析:**对于二叉树的对称性,一方面体现在二叉树本身节点的值是否相同,另一方面对称二叉树还与其结构相同。原创 2023-10-16 17:12:29 · 52 阅读 · 1 评论 -
226.翻转二叉树(递归/Java)
2.如果这个节点的孩子均不存在,则说明二叉树翻转完成(若仅存在一个孩子,仍可以翻转,即交换左右孩子)作为判断结束递归的条件,但当node本身为空时,这会造成空指针,所以当判断左右孩子为空时,可以采用。5.通过上述步骤可以看到,翻转的所有操作都可归结到一个节点的相关操作,所以可以采用递归的思路。1.由题意可知,翻转二叉树实际是将每一个节点的孩子交换位置。当仅判断左右孩子是否为空作为递归条件时,很多同学通过。4.根节点不需要翻转,但要保持根节点的位置不动。,翻转这棵二叉树,并返回其根节点。原创 2023-10-19 11:12:44 · 124 阅读 · 0 评论 -
104/111.二叉树的最大最小深度(递归/Java)
3.遍历节点从左右子树分别遍历(因为,左右子树的深度不可以叠加,有时候它们其实是属于同一层的),返回层数的最小值。节点3的左孩子的深度为0,右孩子的深度为2,根据公式,二叉树的最大深度为0,这与问题不符。节点3的左孩子的深度为0,右孩子的深度为2,根据公式,二叉树的最大深度为3,这没有问题。4.二叉树的最大深度 = 当前节点的深度 + max(左孩子深度,右孩子深度)1.当遍历的节点为一个空节点,则此节点不算作一层,则返回0。3.遍历当前节点的右孩子,返回右孩子的深度。:从根节点到达叶子节点时的深度最小。原创 2023-10-19 11:13:41 · 57 阅读 · 0 评论 -
Day16.图的基本概念与初始化(Java)
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。(顶点V是有穷非空集合)1.无向图:顶点之间的边不存在方向,称为无向边(v1, v2) 无向完全图:存在n*(n-1)/ 2条边2.有向图:顶点之间的边存在方向,称为弧<v1, v2> 有向完全图:存在n*(n-1)条边3.稠密图和稀疏图:边的多少1.权:图的边或弧相关的数叫做权,带权的图叫做网2.子图:V‘ 属于 V, E’ 属于 E。原创 2023-11-03 09:19:13 · 77 阅读 · 0 评论 -
Day17.图的两种遍历方式(DFS/BFS/Java)
1.从一个顶点出发,将此顶点的属性设置为被访问过2.访问与此顶点相关联的一个顶点,重复1的操作3.当访问到一个已经被访问的节点,返回上一个节点4.从上一个节点的还未访问的关联节点开始,重复步骤1,2,如果没有被访问的节点,重复步骤3。原创 2023-11-03 09:20:52 · 58 阅读 · 0 评论 -
Day18.图的拓扑排序(Java/环的处理)
在上述图中想要描述学习Java的顺序关系,这时候可以通过拓扑排序来实现此关系。原创 2023-11-03 09:22:24 · 61 阅读 · 0 评论 -
多元最短路径问题(Floyd-Warshall-算法/Java)
Floyd-Warshall算法是一种用于解决所有点对最短路径问题的动态规划算法。该算法可以找到有向图或带权图中任意两点之间的最短路径。Floyd-Warshall算法的时间复杂度为O(n^3),其中n为顶点的数量。,对角线上的元素赋值为0,表示任意点到自身的距离为0;其他元素赋值为无穷大或一个很大的数值,表示当前两点之间没有直接路径。算法的核心思想是利用矩阵来保存任意两点之间的最短路径的信息。即可用来查找任意两点之间的最短路径距离。,表示通过顶点k能够获得更短的路径。表示点i到点j的最短路径距离。原创 2023-11-11 17:17:40 · 197 阅读 · 0 评论 -
最短路径问题-Dijkstra算法(Java)
Dijkstra算法(又称为迪杰斯特拉算法)是一种用于解决单源最短路径问题的贪心算法,可以在有向图或无向图中用于找到从一个起始节点到所有其他节点的最短路径。该算法的思路是从起点开始,先从所有的连通点中选择距离起点最短的一个点进行扩展,然后以该点为基准继续选择距离起点最短的连通点进行扩展,直到找到目标节点为止。图的最短路径是指在一个图中连接两个节点的最短路径,即通过经过最少的边或具有最小权重的路径。2.选定一个顶点作为起始顶点,将此顶点的距离值设定为0,其他顶点的距离值默认为∞。原创 2023-11-07 16:42:48 · 179 阅读 · 0 评论 -
最短路径问题-Bellman-Ford算法(Java)
算法的核心是对所有边进行V-1轮的松弛操作,其中V是图中顶点的数量。然而,当存在负环时,由于可以无限次绕着负环循环,每一轮的松弛操作都会减小路径的权重。由于负环的存在,路径的权重可以无限地减小,因此无法得到有限的最短路径估计。Bellman-Ford算法是一种用于解决单源最短路径问题的算法,可以处理包含负权边的图。当存在负环时,最短路径问题就没有意义了,因为可以通过无限次绕着负环循环,使得路径的权重趋近于负无穷。图的最短路径是指在一个图中连接两个节点的最短路径,即通过经过最少的边或具有最小权重的路径。原创 2023-11-07 16:44:24 · 165 阅读 · 0 评论