![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DataStructure
文章平均质量分 70
JFS_Study
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
展开
-
二叉树的先序、中序和后序遍历
二叉树的三种遍历方式原创 2022-11-12 14:45:21 · 515 阅读 · 0 评论 -
Java 栈(Stack)
一、Stack 的基本使用1️⃣初始化Stack stack=new Stackpublic Stack()创建一个空堆栈。2️⃣判断是否为空stack.empty()public boolean empty()测试堆栈是否为空。3️⃣取栈顶值元素(【不出栈】不删除栈顶的值)stack.peek()public E peek()查看堆栈顶部的对象,但不从堆栈中移除它。4️⃣取栈顶值元素(【出栈】会把栈顶的值删除)stack.pop();public E pop()移除堆栈顶部的对象,并作为此原创 2022-03-28 10:19:21 · 1268 阅读 · 0 评论 -
双端链表 LinkedList
一、LinkedList 介绍1️⃣LinkedList 是 Java 集合框架中一个重要的实现,其底层采用的双向链表结构,没有初始化大小,就是一直在前面或者后面新增就好。由于基于链表实现,存储元素过程中,无需像ArrayList那样进行扩容。2️⃣LinkedList 存储元素的节点需要额外的空间存储前驱和后继的引用。3️⃣LinkedList 在链表头部和尾部插入效率比较高,但在指定位置进行插入时,效率一般。原因是,在指定位置插入需要定位到该位置处的节点,此操作的时间复杂度为 O(N)。4️⃣和原创 2022-03-28 10:18:30 · 606 阅读 · 0 评论 -
单链表环相关
一、单链表问题1️⃣给一个单链表,判断是否存在环。2️⃣如果存在环,找出环的入口点。3️⃣如果存在环,求出环上节点的个数。4️⃣如果存在环,求出链表的长度。5️⃣如果存在环,求出环上距离任意一个节点最远的点(对面节点)。6️⃣如何判断两个无环链表是否相交。如果相交,求出第一个相交的节点。二、判断时候有环(链表头指针为head)1️⃣“快慢指针”法。就是有两个指针 fast 和 slow,开始的时候两个指针都指向链表头head,然后在每一步操作中 slow 向前走一步即:slow = slo原创 2022-03-25 16:36:29 · 540 阅读 · 0 评论 -
二叉树、平衡二叉树、红黑树、B树、B+树与B*树
一、二叉树1️⃣二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图:基于二叉查找树的这种特点,在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点。n 个节点的二叉树,正常情况下,查找的时间复杂度为 O(logN)。之所以说是正常情况下,是因为二叉查找树有可能出现一种极端的情况,例如:这种情况虽也满足二叉树的条件,但已经近似退化为一条链表,这样的二叉树的查找时间复杂度顿时变成了 O(n)。所以必须防止这种情况发生,于是引申出了平衡二叉树。二、平衡二叉树原创 2022-03-25 15:37:52 · 1256 阅读 · 0 评论 -
二叉树:找出两个节点的最近公共祖先
一、问题描述给定二叉树(不是二叉搜索树)和两个节点 n1 和 n2,编程实现找到二者的最近公共祖先(Lowest Common Ancestor,LCA)。二、思路分析LCA定义:最近公共祖先是两个节点所有公共祖先中离根节点最远的节点。从根开始遍历树,如果任一给定节点(n1和n2)与根匹配,则根为 LCA。如果根与任何节点都不匹配,重复左右子树中寻找节点 n1 和 n2。如果在其左子树中存在一个节点而在右子树中存在的另一个节点,则此节点即为 LCA。如果两个节点都位于左子树中,则 LCA 也位于左子原创 2022-03-25 14:29:46 · 5222 阅读 · 1 评论 -
反转链表(Reverse Linked List)
反转一个单链表:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULLpublic class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}一、 迭代法注意观察示例:1->2->3->4->5->NULL 的反转可以看成:NULL<-1<-2<-3<原创 2022-03-07 15:23:42 · 618 阅读 · 0 评论 -
LinkedBlockingDeque 阻塞队列
一、简述LinkedBlockingDeque 是一个由链表结构组成的双向阻塞队列,即可以从队列的两端插入和移除元素。双向队列因为多了一个操作队列的入口,在多线程同时入队时,也就减少了一半的竞争。相比于其他阻塞队列,LinkedBlockingDeque 多了 addFirst、addLast、peekFirst、peekLast 等方法。以first结尾的方法,表示插入、获取或移除双端队列的第一个元素。以 last 结尾的方法,表示插入、获取或移除双端队列的最后一个元素。LinkedBlockingDe原创 2022-03-07 15:22:31 · 752 阅读 · 0 评论 -
延时 队列
一、什么是延时队列延时队列相比于普通队列最大的区别就体现在其延时的属性上,普通队列的元素是先进先出,按入队顺序进行处理,而延时队列中的元素在入队时会指定一个延迟时间,表示其希望能够在经过该指定时间后处理。从某种意义上来讲,延迟队列的结构并不像一个队列,而更像是一种以时间为权重的有序堆结构。二、延时队列的应用技术没有最好的只有最合适的。延时队列在项目中的应用还是比较多的,尤其像电商类平台:12306 下单成功后,在半个小时内没有支付,自动取消订单。如果订单一直处于某一个未完结状态时,及时处理关单原创 2022-03-07 15:19:27 · 16631 阅读 · 2 评论 -
不知道长度的 LinkedList,如何找到中间元素
一、简述适配器模式指将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。比如说电脑一个显示屏不够用,再加一个。新加的显示屏接头不能和电脑适配,需要转换器接入。这就是适配器模式的一个体现。适配器模式在 Java 中十分常用。这种模式适用于以下场景:想使用一个已存在的类,但是该类不符合接口需求;或者需要创建一个可重用的类,适配没有提供合适接口的其它类。如:java.io.InputStreamReader(InputStream) (返回一个Rea原创 2022-03-07 15:04:53 · 418 阅读 · 0 评论 -
队列(Queue)
一、队列的概念队列是一个先进先出的数据结构。联想一下链表,在单链表中,只能对表尾进行插入,对表头进行结点的删除,这样强限制性的链表,就是所说的队列。也就是说,队列是限定在表的一端进行插入,表的另一端进行删除的数据结构。如图去买票排队,每一列队伍都有一个队尾和队首,先来的先买票,后来的后买,买好的就从队首出去,新来买票的就需要从队尾继续排队。通常,称进数据的一端为队尾,出数据的一端为队首,数据元素进队列的过程称为入队,出队列的过程称为出队。队列是一个线性的数据结构,并且这个数据结构只允许在一端进行插原创 2022-03-04 09:43:11 · 31979 阅读 · 9 评论 -
Java 链表
一、链表介绍数组和链表都是最基础的线性数据结构,可以用来实现栈,队列等非线性,有特定应用场景的数据结构。数组作为数据存储结构有很多缺陷,在无序数组中搜索效率低,在有序数组中插入效率又很低,无论哪种情况删除操作效率都很低。而且数组一旦创建,大小不可更改。除非是要频繁通过下标访问数据,否则在很多场合都可以用链表替换数组。1️⃣什么是链表?链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表通常由一连串节点组成,每个节点包含该节点的数据和指向上一节点或者原创 2022-03-04 09:40:39 · 1190 阅读 · 0 评论