环形缓冲区、链表及二叉树示例

简介: 环形缓冲区、链表及二叉树示例

一、环形缓冲区


循环队列一般是以环形缓冲区(ring buffer)的方式实现的,它是一种用于表示一种固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。假如我们用6个元素的数组来实现一个环形缓冲区,这时可以从起始位置开始有序的存储数据,然后再按照存储时的顺序把数据读出来。在数组的末尾写入数据后,后一个数据就会从缓冲区的头开始写,这样,数组的末尾和开头就连接起来了


环形缓冲区模型:



二、链表


链表是可以不用考虑索引的顺序就可以对元素进行读写的方式。通过链表,可以高效的对数据元素进行添加删除操作。


在实现数组的基础上,除了数据的值之外,通过为其附带上下一个元素的索引,即可实现链表。数据的值和下一个元素的地址(索引)就构成了一个链表元素,如下所示:


链表的数据结构:



对链表的添加和删除都是非常高效的,假如我们要删除地址为p[2]的元素


链表的删除:



删除地址为p[2]的元素后,直接将链表剔除,并把p[2]前一个元素p[1]的指针域指向p[2]下一个链表元素的数据区即可


链表的添加:



对于新添加进来的链表,需要确定插入位置,比如要在p[2]和p[3]之间插入地址为p[6]的元素,需要将p[6]的前一个位置p[2]的指针域改为p[6]的地址,然后将p[6]的指针域改为p[3]的地址即可


链表的添加不涉及到 数据的移动,所以链表的添加和删除很快,而数组的添加设计到数据的移动,所以比较慢,通常情况下,使用数组来检索数据,使用链表来进行添加和删除操作


三、二叉树


二叉树也是一种检索效率非常高的数据结构,二叉树是指在链表的基础上往数组追加元素时,考虑到数组的大小关系,将其分成左右两个方向的表现形式。假如我们把50这个值保存到了数组中,那么如果接下来要进行值写入的话,就需要和50比较,确定谁大谁小,比50数值大的放右边,小的放左边,下图是二叉树的比较示意图:



二叉树是由链表发展而来,因此二叉树在追加和删除元素方面也是同样有效的

这一切的演变都是以内存为基础的。

目录
相关文章
|
5月前
|
Java
环形数组链表(java)
环形数组链表(java)
|
5月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
1月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
28 0
|
3月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
27 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
4月前
【数据结构OJ题】环形链表
力扣题目——环形链表
37 3
【数据结构OJ题】环形链表
|
4月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
30 1
【数据结构OJ题】环形链表II
|
5月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
53 2
|
5月前
|
存储 算法
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
62 0
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
|
4月前
|
Java 索引
力扣经典150题第五十六题:环形链表
力扣经典150题第五十六题:环形链表
33 0
|
5月前
|
Java
单向环形链表-约瑟夫问题(java)
单向环形链表-约瑟夫问题(java)