Java数据结构和算法:线性表
线性表的定义
线性表(linear-list)是最常用最简单的一种数据结构。一个线性表是n (n≥0)个相同类型数据元素的有限序列。记为: L= (a1, a2 , … , an )。
其中,L是表名,a1是第一个数据元素(也简称为首元素),无前驱,只有一个后继;an是最后一个数据元素(即第n个数据元素),只有一个前驱,无后继。其余的每个数据元素ai (i=2,3, … ,n-1)都只有一个前驱,且只有一个后继。i (i=1,2, … ,n)称为表中元素序号。n是数据元素的个数,也称为表的长度,若n=0,L称作空表。
线性表的顺序表示
线性表的顺序存储方式是指:用一组连续的有限空间依次存储线性表中的数据元素,简称为顺序表。
顺序表的特点是:
一块地址连续的空间存放线性表中的数据元素。任意两个逻辑上相邻的数据元素在物理上也必然相邻。
顺序表可以随机访问。
顺序表通常用数组存储,在C++中,数组有静态数组和动态数组两种,在此我们将采用动态数组方式存储。
顺序表插入、删除算法的复杂度分析
通常顺序表的插入和删除操作都会保持各元素原来的顺序不变。
举例来看顺序表上的插入和删除。
在原来已有7个元素的表的第4个元素前插入数据元素x=24的过程。
线性表的顺序存储方式的缺陷
顺序表是用数组方式来存储的,因数组元素个数固定。当顺序表的长度等于数组的元素个数时,顺序表就不能再插入新数据元素了。
对于有n个数据元素的顺序表,若要保持各数据元素原来的顺序不变,则插入和删除一个数据元素的时间复杂度为O(n)。
顺序表要求存储空间是物理上连续的,这样即使存储空间中的存储单位数超过所需的数目,却因其不连续,也无法使用。
克服这些缺陷的办法是:对线性表采用链表存储方式。
在链表存储方式中,用户通过new函数向系统动态申请所需的存储空间,把数据元素插入链表中合适的位置,而这些在不同时刻向系统动态申请的存储空间在内存中很可能不连续。
因而,任意两个在逻辑上相邻的数据元素在物理上不一定相邻,数据元素的逻辑次序是通过链表中的指针链接实现的。
链表的表长是动态的、可扩充的,在链表中插入和删除时不需移动元素。
用链表存储方式存储线性表数据元素的方法是用结点(node)构造链。结点通常有一个数据域,另外还有一个或一个以上的指针域。
链表存储主要有单链、单循环链和双向链等三种。这三种结构中每一种又有带头结点结构和不带头结点结构两种。
单链表
单链表的结构
采用链接存储方式存储的线性表称为线性链表,又称单链表(linked list),或简称为链表。在单链表中,每一个数据元素占用一个结点。如图3-5所示。一个结点由两个域组成,一个域存放数据元素data,一个域存放指向该链表中下一个结点的指针next,它给出下一个结点的开始存储地址。
在单链表的表尾结点中,指针域为空以“”表示之。设线性表存有某系99级学生的学号如下:(99101,99104,99110,99201,99208),可用如图3-6所示的单链表表示。
单链表结构中又有带头结点和不带头结点两种结构。像图3-6这样的第一个结点就是数据结点的单链表结构,我们称其为不带头结点的单链表。
3-7是带头结点的单链表结构,头结点是由头指针所指向的不存放数据元素的结点。我们把头结点的数据域部分涂上阴影,以明显表示该结点为头结点。
单循环链表
单循环链表,简称循环链表(circular list), 是线性表的另一种链表表示,它的结点结构与单链表相同,由一个数据域和一个指针域组成,与单链表不同的是链表中表尾结点的next域中不是NULL,而是存放了head所指的结点。
在单循环链表中判断当前指针pcurrent是否到达链表尾的条件应是pcurrent->next == head。
单循环链表也有不带头结点和带头结点两种结构,分别如图3-14,图3-15所示。
对单循环链表,只要知道表中任一结点的地址,就能遍历表中其他任何结点。循环链表的运算与单链表类似,不过在链头与链尾处理时有所不同。
Java数据结构和算法:线性表相关推荐
- Java版数据结构与算法——线性表
*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...
- 数据结构于算法—线性表
目录 前言 线性表基本架构 顺序表 插入 删除 其他操作 链表 基本结构 插入 带头节点与不带头节点 插入尾 删除 其他 代码实现 顺序表 链表 测试与结果 总结 原创公众号:bigsai 文章收藏在 ...
- 数据结构与算法 | 线性表 —— 链表
原文链接:wangwei.one/posts/java-- 链表 定义 逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着.恰恰相反,数据随机分布在内存中的各个位置,这种存储结构 ...
- 线性表算法题库_数据结构与算法(线性表)练习题
.word 资料 . 三.写一个算法合并两个已排序的线性表. (用两种方法:数组表示的线性表(顺序表)和 指针表示的线性表(链表) ) 要求: 1 .定义线性表节点的结构,并定义节点的型和位置的型. ...
- Java数据结构与算法 线性查找和二分查找
查找 查找(searching)是在一组数据项中找到指定的目标元素(target element)或者判定组内不存在目标的过程.要查找的数据项组有事成为查找池(search pool). 在此讨论两种 ...
- educoder数据结构与算法 线性表 第1关:实现一个顺序存储的线性表
任务描述 本关任务:实现 step1/Seqlist.cpp 中的SL_InsAt.SL_DelAt和SL_DelValue三个操作函数,以实现线性表中数据的插入.删除与查找等功能. 相关知识 线性表 ...
- 数据结构与算法--线性表的查找
一.查找的基本概念 1) 查找表: 查找表是由同一类型的数据元素(或记录)构成的集合 2) 由于集合中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构 3) 查找: 根据 ...
- 数据结构与算法——线性表的顺序储存结构
目录 前言 一.顺序储存的定义及储存方式 二.地址计算方法 三.顺序存储结构的插入和删除 3.1 获得元素操作 3.2 插入操作 3.3 删除操作 四.分析插入和删除操作的时间复杂度 五.线 ...
- 数据结构与算法--线性表(顺序表)
本图文主要掌握以下问题: 1. 什么是线性表,线性表有哪些操作? 2. 如何利用顺序结构实现线性表?
- 头歌-数据结构与算法 - 线性表
第1关:实现一个顺序存储的线性表 #include <stdio.h> #include <stdlib.h> #include "Seqlist.h" S ...
最新文章
- 5G商用对视频会议市场增长具有积极意义
- 掌握Java 11的Constantdynamic
- linq 分组求和的一般方法
- 【Python】Matplotlib绘制带颜色标尺的彩色曲面
- mysql show status 过滤_在线更改复制过滤选项的方法
- IDEA将maven项目配置到本地tomcat中运行
- JSON格式解析和libjson使用简介-转
- Vscode ROS 环境搭建
- 编译好的C一执行就崩溃,第一句输出都没有,是怎么回事?
- windows与linux线程,Linux和Windows两种风格的操作系统,创建线程的方式有何不同?...
- element 怎么把数据写到日历表上_当mongo数据量过亿时该如何删除重复的数据
- 机械革命计算机配置,机械革命笔记本Bios设置方法
- 电子发票撤销 java_已确认的发票如何撤销
- 众所周知B站(哔哩哔哩)是一个学习软件
- 远程关闭计算机提示拒绝访问权限,win7系统远程关机拒绝访问的解决方法
- oracle 4098,ORA-04098错误解决方法-数据库专栏,ORACLE
- Python3.5 使用 protobuf3.0.0.beta2
- ddms java 截图_从Android设备获取实时截屏
- 网页设计排版中哪些元素比较重要?
- python爬虫 request+lxml爬取黄页88网企业信息