数据结构和算法(四)

it2024-08-20  45

1.5链表

链表:链表结构的每个节点数据都由两个域组成,一个是存放实际数据元素的数据域,另一个就是构成链式结构的指针域. 单向链表:指针域只有一个后向指针 双向链表:指针域由一个后向指针和一个前向指针组成链表访问数据元素的效率比较低,需要从链表头部向后搜索,查找操作的时间复杂度为O(n). 在某些应用场合,可以将链表尾部节点的后向指针指向链表头部节点,构成一个环形链表 。

单向链表: 单链表的示意图如下:

表头为空,表头的后继节点是"节点10"(数据为10的节点),“节点10"的后继节点是"节点20”(数据为10的节点),…

单链表删除节点

删除"节点30" 删除之前:“节点20” 的后继节点为"节点30",而"节点30" 的后继节点为"节点40"。 删除之后:“节点20” 的后继节点为"节点40"。

单链表添加节点

在"节点10"与"节点20"之间添加"节点15" 添加之前:“节点10” 的后继节点为"节点20"。 添加之后:“节点10” 的后继节点为"节点15",而"节点15" 的后继节点为"节点20"。 单链表的特点是:节点的链接方向是单向的;相对于数组来说,单链表的的随机访问速度较慢,但是单链表删除/添加数据的效率很高。

双向链表

双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

双链表的示意图如下:

表头为空,表头的后继节点为"节点10"(数据为10的节点);“节点10"的后继节点是"节点20”(数据为10的节点),“节点20"的前继节点是"节点10”;“节点20"的后继节点是"节点30”,“节点30"的前继节点是"节点20”;…;末尾节点的后继节点是表头。

双链表删除节点

删除"节点30" 删除之前:“节点20"的后继节点为"节点30”,“节点30” 的前继节点为"节点20"。“节点30"的后继节点为"节点40”,“节点40” 的前继节点为"节点30"。 删除之后:“节点20"的后继节点为"节点40”,“节点40” 的前继节点为"节点20"。

双链表添加节点

在"节点10"与"节点20"之间添加"节点15" 添加之前:“节点10"的后继节点为"节点20”,“节点20” 的前继节点为"节点10"。 添加之后:“节点10"的后继节点为"节点15”,“节点15” 的前继节点为"节点10"。“节点15"的后继节点为"节点20”,“节点20” 的前继节点为"节点15"。

线性结构的使用总结: 1.数组 对数组的基本操作有查找、插入、删除. 数组元素的直接访问几乎没有开销,但是插入和删除操作需要移动数组元素,开销比较大,因此在插入和删除操作比较频繁的场合下,不适合用数组. 在数组中查找一个元素的时间复杂度为O(n) 如果数组元素是有序存储的,则使用二分查找可以将时间复杂度降到O(lgn) 2. 栈 (先进后出) 栈的数据存储方式可以采用数组或链表.分别被称为”顺序栈”和”链式栈”. 利用栈的一些特性,可以将某算法的递归实现转换成非递归实现. 有时,广度优先搜索(走的是横向)和深度优先搜索(走的是纵向)的差异仅仅是使用栈还是使用队列. 判断表达式的括号是否匹配算法,可以使用栈这种数据结构 3. 队列 队列和栈一样,都不是数据存储方式,而是一种逻辑管理方式. 队列的数据存储方式可以采用数组,也可以使用链表 队列有多种形式: 普通的队列(先进先出)头上删除,尾部进行添加。 环形队列(收尾相连接的)采用数组的线性空间,数据组织简单。能很快知道队列是否满为空。能以很快速度的来存取数据。因为有简单高效的原因,甚至在硬件都实现了环形队列。环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用程序大量交换数据,从硬件接收大量数据)均使用了环形队列。 双端队列:即在队列两端都可以插入和删除。同时拥有栈和队列的功能,一般使用频率较低,时间复杂度 O(1)。 优先级队列:内部维护一个按优先级排序的序列。插入时需要比较查找插入的位置,时间复杂度O(N), 删除O(1)。

队列在算法中的应用:图的广度优先搜索算法、操作系统中的线程调度算法、管理数据报文的发送和接收;

最新回复(0)