数据结构复习笔记

合集下载

408背诵笔记

408背诵笔记

408背诵笔记
408背诵笔记:
1. 数据结构:
数据结构的基本概念:数据结构是数据元素的集合及定义在此集合上的基本操作。

线性结构:数组、链表、栈、队列。

非线性结构:树、图、散列表。

2. 算法:
算法的时间复杂度:描述算法运行时间随输入规模变化的规律。

算法的空间复杂度:描述算法所需存储空间随输入规模变化的规律。

3. 操作系统:
进程管理:进程的概念、状态、转换、创建与终止。

内存管理:内存的分配与回收、虚拟内存。

文件管理:文件的逻辑结构、物理结构及文件系统的功能。

4. 计算机组成原理:
CPU:指令系统、指令流水线、指令周期。

存储器层次结构:主存、高速缓存、辅存。

I/O 原理:I/O 设备分类、I/O 控制方式、设备驱动程序。

5. 计算机网络:
网络协议:TCP/IP 协议族、应用层协议(HTTP、FTP、SMTP)。

网络设备:路由器、交换机、网关。

网络安全:加密技术、数字签名、防火墙。

6. 数据库系统:
关系数据库模型:关系模型的基本概念、关系代数、关系演算。

数据库设计:需求分析、概念设计、逻辑设计、物理设计。

数据库管理系统:功能组件、数据字典、查询处理过程。

数据结构期末复习重点知识点总结

数据结构期末复习重点知识点总结

数据结构期末复习重点知识点总结一、数据结构概述数据结构是计算机科学中一门关于数据组织、存储和管理的学科。

它涉及到各种数据类型和它们之间的关系,以及对这些数据类型进行有效操作和处理的算法。

二、基本数据结构1. 数组- 数组是一种线性数据结构,用于存储相同类型的数据元素。

- 数组的特点是随机访问和连续存储。

- 数组的插入和删除操作需要移动其他元素,时间复杂度为O(n)。

2. 链表- 链表是一种线性数据结构,通过节点之间的指针链接来组织数据。

- 链表的特点是插入和删除操作简单,时间复杂度为O(1)。

- 链表分为单链表、双向链表和循环链表等不同类型。

3. 栈- 栈是一种具有后进先出(LIFO)特性的数据结构。

- 栈的操作主要包括压栈(Push)和弹栈(Pop)两个操作。

- 栈常用于表达式求值、递归算法的实现等场景。

4. 队列- 队列是一种具有先进先出(FIFO)特性的数据结构。

- 队列的操作主要包括入队(Enqueue)和出队(Dequeue)两个操作。

- 队列常用于实现缓冲区、消息队列等场景。

5. 树- 树是一种非线性的数据结构,由节点和边组成。

- 树的节点具有层级关系,由根节点、子节点和叶节点等组成。

- 常见的树结构有二叉树、红黑树、B树等。

6. 图- 图是一种非线性的数据结构,由节点和边组成。

- 图的节点之间可以有多对多的关系。

- 图的遍历方式有深度优先搜索(DFS)和广度优先搜索(BFS)。

三、常见的数据结构算法1. 排序算法- 冒泡排序、插入排序、选择排序等简单但效率较低的排序算法。

- 快速排序、归并排序、堆排序等高效的排序算法。

- 基数排序、桶排序等适用于特定场景的排序算法。

2. 查找算法- 顺序查找、二分查找等常用的查找算法。

- 树结构相关的查找算法,如二叉搜索树、红黑树等。

- 哈希查找、索引查找等高效的查找算法。

3. 图算法- Dijkstra算法、Bellman-Ford算法等最短路径算法。

数据结构复习资料复习提纲知识要点归纳

数据结构复习资料复习提纲知识要点归纳

数据结构复习资料复习提纲知识要点归纳数据结构复习资料:复习提纲知识要点归纳一、数据结构概述1. 数据结构的定义和作用2. 常见的数据结构类型3. 数据结构与算法的关系二、线性结构1. 数组的概念及其特点2. 链表的概念及其分类3. 栈的定义和基本操作4. 队列的定义和基本操作三、树结构1. 树的基本概念及定义2. 二叉树的性质和遍历方式3. 平衡二叉树的概念及应用4. 堆的定义和基本操作四、图结构1. 图的基本概念及表示方法2. 图的遍历算法:深度优先搜索和广度优先搜索3. 最短路径算法及其应用4. 最小生成树算法及其应用五、查找与排序1. 查找算法的分类及其特点2. 顺序查找和二分查找算法3. 哈希查找算法及其应用4. 常见的排序算法:冒泡排序、插入排序、选择排序、归并排序、快速排序六、高级数据结构1. 图的高级算法:拓扑排序和关键路径2. 并查集的定义和操作3. 线段树的概念及其应用4. Trie树的概念及其应用七、应用案例1. 使用数据结构解决实际问题的案例介绍2. 如何选择适合的数据结构和算法八、复杂度分析1. 时间复杂度和空间复杂度的定义2. 如何进行复杂度分析3. 常见算法的复杂度比较九、常见问题及解决方法1. 数据结构相关的常见问题解答2. 如何优化算法的性能十、总结与展望1. 数据结构学习的重要性和难点2. 对未来数据结构的发展趋势的展望以上是数据结构复习资料的复习提纲知识要点归纳。

希望能够帮助你进行复习和回顾,加深对数据结构的理解和掌握。

在学习过程中,要注重理论与实践相结合,多进行编程练习和实际应用,提高数据结构的实际运用能力。

祝你复习顺利,取得好成绩!。

数据结构笔记

数据结构笔记

数据结构笔记数据结构是计算机科学中非常重要的一个概念,它涉及组织、存储和管理数据的方法。

在本次笔记中,我们将介绍常见的数据结构以及它们的特点和应用。

一、数组(Array)数组是一种线性数据结构,它由相同类型的数据元素组成,并按照一定顺序排列。

数组的特点是连续存储和下标访问,这使得对数组的查找和修改操作非常高效。

然而,数组的插入和删除操作相对较慢,需要移动其他元素。

二、链表(Linked List)链表也是一种线性数据结构,它由节点组成,每个节点包含数据和指向下一个节点的指针。

链表的特点是动态存储和灵活的插入删除操作。

然而,链表的访问效率较低,需要按序遍历。

三、栈(Stack)栈是一种后进先出(LIFO)的数据结构,它只允许在栈顶进行插入和删除操作。

栈的特点是简单快速,用于实现逆序输出、括号匹配等问题。

四、队列(Queue)队列是一种先进先出(FIFO)的数据结构,它允许在一端插入元素,在另一端删除元素。

队列的特点是用于模拟实际情况,如排队、缓冲区等。

五、树(Tree)树是一种非线性数据结构,它由节点和边组成,每个节点可以有多个子节点。

树的特点是逐层存储和高效的查找。

常见的树结构包括二叉树、二叉搜索树和平衡二叉树等。

六、图(Graph)图是一种由节点和边组成的非线性数据结构,它可以用于表示各种复杂关系。

图的表示方法有邻接矩阵和邻接表两种方式,可以用于解决最短路径、网络流等问题。

七、堆(Heap)堆是一种特殊的树结构,它是一个完全二叉树,并且具有堆序性质。

堆的特点是可以快速找到最大或最小元素,并基于此进行堆排序、优先队列等操作。

八、哈希表(Hash Table)哈希表是一种基于哈希函数实现键值对存储的数据结构,它通过将键映射到存储位置来提高访问效率。

哈希表的特点是快速的插入和查找操作,适用于大规模数据。

在实际应用中,不同的数据结构有不同的应用场景和优缺点,合理选择和使用数据结构是编写高效程序的关键。

数据结构详细笔记

数据结构详细笔记

第1章绪论◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型。

数据——所有能被计算机识别、存储和处理的符号的集合。

数据元素——是数据的基本单位,具有完整确定的实际意义。

数据对象——具有相同性质的数据元素的集合,是数据的一个子集。

数据结构——是相互之间存在一种或多种特定关系的数据元素的集合,表示为:Data_Structure=(D, R)数据类型——是一个值的集合和定义在该值上的一组操作的总称。

抽象数据类型——由用户定义的一个数学模型与定义在该模型上的一组操作,它由基本的数据类型构成。

◆算法算法:是指解题方案的准确而完整的描述。

算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。

算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。

特征包括:(1)可行性;(2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,不允许有多义性;(3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止,包括合理的执行时间的含义;(4)拥有足够的情报。

算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。

指令系统:一个计算机系统能执行的所有指令的集合。

基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。

算法的控制结构:顺序结构、选择结构、循环结构。

算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。

算法复杂度:算法时间复杂度和算法空间复杂度。

算法时间复杂度是指执行算法所需要的计算工作量。

算法空间复杂度是指执行这个算法所需要的内存空间。

for ( i = 1 , i < = 10 , i++ ) x=x+c; =>O(1)for ( i = 1 , i < = n , i++ ) x=x+n; =>O(n)多嵌套一个for,则为=>O(n^2) 以此类推真题难点:i = 1,while(i < = n)i = i * 3;=>O(log3^n)i = i * 2;=>O(log2^n) 以此类推数据的逻辑结构有以下两大类:线性结构:有且仅有一个开始结点和一个终端结点,且所有结点都最多只有一个直接前驱和一个直接后继。

数据结构考研笔记整理(全)

数据结构考研笔记整理(全)

数据结构考研笔记整理(全)一、第二章线性表●考纲内容●一、线性表的基本概念●线性表是具有相同数据结构类型的n个数据元素的有限序列;线性表为逻辑结构,实现线性表的存储结构为顺序表或者链表●二、线性表的实现●1、顺序表●定义(静态分配)●#define MaxSize 50 \\ typedef struct{ \\ ElemType data[MaxSize];\\ intlength;\\ }SqList;●定义(动态分配)●#define MaxSize 50\\ typedef strcut{\\ EleType *data; //指示动态非配数组的指针\\ int MaxSize,length;\\ }SqList;●c的动态分配语句为L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);●c++动态分配语句为L.data=new ElemType[InitSize];●插入操作●删除操作●按值寻找●2、链表●单链表●单链表的定义●●头插法建立单链表●●尾插法建立单链表●●按序号查找getElem(LinkList L,int i)和按值查找locateElem(LinkListL,ElemType e)●插入结点(后插)●p=getElem(L,i-1); //查找插入位置的前驱结点\\ s.next=p.next;\\p.next=s;●将前插操作转化为后插操作,即先将s插入的p的后面然后调换s和p的数据域●s.next=p.next;\\ p.next=s.next;\\ temp=p.data;\\ p.data=s.data;\\s.data=temp;●删除结点●p.getElem(L,i-1);\\ q=p.next;\\ p.next=q.next;\\ free(q);●双链表(结点中有prior指针和next指针)●循环链表●静态链表●借助数组来描述线性表的链式存储结构,结点中的指针域next为下一个元素的数组下标●三、线性表的应用●使用的时候如何选择链表还是顺序表?●表长难以估计,经常需要增加、删除操作——链表;表长可以估计,查询比较多——顺序表●链表的头插法,尾插法,逆置法,归并法,双指针法;顺序表结合排序算法和查找算法的应用●小知识点(选择题)二、第三章栈,队列和数组●考纲内容●一、栈和队列的基本概念●栈:后进先出,LIFO,逻辑结构上是一种操作受限的线性表●队列:先进先出,FIFO,逻辑结构上也是一种操作受限的线性表●二、栈和队列的顺序存储结构●栈的顺序存储●●队列的顺序存储●进队:队不满时,送值到队尾元素,再将队尾指针加一●出队:队不空时,取队头元素值,再将队头指针加一●判断队空:Q.front==Q.rear==0;●循环队列(牺牲一个单元来区分队空和队满,尾指针指向队尾元素的后一个位置,也就是即将要插入的位置)●初始:Q.front==Q.rear●队满:(Q.rear+1)%MaxSize=Q.front●出队,队首指针进1:Q.front=(Q.front+1)%MaxSize●入队,队尾指针进1:Q.rear=(Q.rear+1)%MaxSize●队列长度:(Q.rear+MaxSize-Q.front)%MaxSize●三、栈和队列的链式存储结构●栈的链式存储●●队列的链式存储●实际是上一个同时带有头指针和尾指针的单链表,尾指针指向单链表的最后一个结点,与顺序存储不同,通常带有头结点●四、多维数组的存储●行优先:00,01,02,10,11,12●列优先:00,10,01,11,02,12●五、特殊矩阵的压缩存储●对称矩阵●三角矩阵●三对角矩阵(带状矩阵)●稀疏矩阵●将非零元素及其相应的行和列构成一个三元组存储●十字链表法●六、栈、队列、数组的应用●栈在括号匹配中的应用●栈在递归中的应用●函数在递归调用过程中的特点:最后被调用的函数最先执行结束●队列在层次遍历中的应用●二叉树的层次遍历●1跟结点入队●2若队空,则结束遍历,否则重复3操作●3队列中的第一个结点出队并访问,若有左孩子,则左孩子入队;若有右孩子,则右孩子入队●重点为栈的(出入栈过程、出栈序列的合法性)和队列的操作及其特征●小知识点(选择题)●n个不同元素进栈,出栈元素不同排列的个数为{2n\choose n }/(n+1)●共享栈是指让两个顺序栈共享一个存储空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸,可以更有效的利用存储空间,同时对存储效率没有什么影响●双端队列是指允许两端都可以进行入队和出队操作的队列●输出受限的双端队列:允许两端插入,只允许一端删除●输入受限的双端队列:允许两端删除,只允许一端插入三、第四章串●考纲内容●字符串模式匹配●暴力算法●注意指针回退时的操作是i=i-j+2;j=j+1;●kmp算法●手工求next数组时,next[j]=s的最长相等前后缀长度+1,其中s为1到j-1个字符组成的串●在实际kmp算法中,为了使公式更简洁、计算简单,如果串的位序是从1开始的,则next数组需要整体加一;如果串的位序是从0开始的,则next数组不需要加一●根据next数组求解nextval数组:如果p[j]==p[next[j]],则nextval[j]=nextval[next[j]],否则nextval[j]=next[j];●小知识点●串和线性表的区别:1线性表的数据元素可以不同,但串的数据元素一般是字符;2串的操作对象通常是子串而不是某一个字符四、第五章树与二叉树●考纲内容●一、树的基本概念●定义●树是一种递归的数据结构,是一种逻辑结构●树的性质●结点数为n,则边的数量为n-1●树中的结点数等于所有结点的度数之和加1(一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度,每一条边表示一个结点,对应一个度,只有根结点上面无边,故结点树=度数之和+1)●度为m的树中第i层至多有m^{i-1}个结点(i\geq1)(m叉树的第i层最多有m^{i-1}个结点)●高度为h的m叉树至多有(m^h-1)/(m-1)个结点(假设每一个结点都有m个孩子,则由等比数列的求和公式可以推导出该式子)●具有n个结点的m叉树的最小高度是\lceil log_m(n(m-1)+1)\rceil(由高度为h的m叉树的最大结点树公式有,n满足式子(m^{h-1}-1)/(m-1) \leq n\leq (m^h-1)/(m-1))●高度为h的m叉树至少有h个结点;高为h,度为m的树至少有h+m-1个结点(m叉树并不等于度为m的树,m叉树可以为空树,要求所有结点的度小于等于m,而度为m的树一定有一个结点的度数为m)●二、二叉树●二叉树的定义及其主要特征●定义●特点●每个结点至多只有两颗子树●二叉树是有序树,其子树有左右之分,次序不能颠倒,否则将成为另一颗二叉树,即使树中结点只有一颗子树,也要区分他是左子树还是右子树●特殊的二叉树●满二叉树:高度为h,结点数为2^h-1,所有叶子结点都集中在二叉树的最下面一层,除叶子结点外的所有结点度数都为2,从根结点为1开始编号,对于编号为i的结点,其父结点为\lfloor i/2 \rfloor,左孩子(若有)编号为2i,右孩子(若有)编号为2i+1,所以编号为偶数的结点只可能是左孩子,编号为奇数的结点只可能是右孩子●完全二叉树:删除了满二叉树中编号更大的结点,高为h,结点数为n的完全二叉树的每个结点的编号都与高度为h的满二叉树中编号为1到n的结点相同。

数据结构复习要点(整理版)

数据结构复习要点(整理版)

第一章数据结构概述基本概念与术语1.数据:数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序所处理的符号的总称。

2.数据元素:数据元素是数据的基本单位,是数据这个集合中的个体,也称之为元素,结点,顶点记录。

(补充:一个数据元素可由若干个数据项组成。

数据项是数据的不可分割的最小单位。

)3.数据对象:数据对象是具有相同性质的数据元素的集合,是数据的一个子集。

(有时候也叫做属性。

)4.数据结构:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

(1)数据的逻辑结构:数据的逻辑结构是指数据元素之间存在的固有逻辑关系,常称为数据结构。

数据的逻辑结构是从数据元素之间存在的逻辑关系上描述数据与数据的存储无关,是独立于计算机的。

依据数据元素之间的关系,可以把数据的逻辑结构分成以下几种:1.集合:数据中的数据元素之间除了“同属于一个集合“的关系以外,没有其他关系。

2.线性结构:结构中的数据元素之间存在“一对一“的关系。

若结构为非空集合,则除了第一个元素之外,和最后一个元素之外,其他每个元素都只有一个直接前驱和一个直接后继。

3.树形结构:结构中的数据元素之间存在“一对多“的关系。

若数据为非空集,则除了第一个元素(根)之外,其它每个数据元素都只有一个直接前驱,以及多个或零个直接后继。

4.图状结构:结构中的数据元素存在“多对多”的关系。

若结构为非空集,折每个数据可有多个(或零个)直接后继。

(2)数据的存储结构:数据元素及其关系在计算机内的表示称为数据的存储结构。

想要计算机处理数据,就必须把数据的逻辑结构映射为数据的存储结构。

逻辑结构可以映射为以下两种存储结构:1.顺序存储结构:把逻辑上相邻的数据元素存储在物理位置也相邻的存储单元中,借助元素在存储器中的相对位置来表示数据之间的逻辑关系。

2.链式存储结构:借助指针表达数据元素之间的逻辑关系。

不要求逻辑上相邻的数据元素物理位置上也相邻。

数据结构知识点归纳

数据结构知识点归纳

数据结构知识点归纳数据结构知识点归纳1.线性数据结构1.1 数组1.1.1 基本操作1.1.2 时间复杂度1.1.3 动态数组1.1.4 多维数组1.2 链表1.2.1 单向链表1.2.2 双向链表1.2.3 循环链表1.2.4 基本操作1.2.5 时间复杂度1.3 栈1.3.1 基本操作1.3.2 应用场景1.4 队列1.4.1 基本操作1.4.2 队列的实现方式 1.4.3 阻塞队列1.4.4 并发队列2.树形数据结构2.1 二叉树2.1.1 基本概念2.1.2 二叉树的遍历2.1.3 二叉树的构建方式 2.2 堆2.2.1 最大堆和最小堆 2.2.2 堆的实现方式2.2.3 堆的应用场景2.3 平衡二叉树2.3.1 AVL树2.3.2 红黑树2.4 B树和B+树2.4.1 基本概念2.4.2 B树的插入和删除操作2.4.3 B+树的优势和应用场景3.图形数据结构3.1 无向图和有向图3.2 图的遍历3.2.1 深度优先搜索(DFS) 3.2.2 广度优先搜索(BFS) 3.3 最短路径算法3.3.1 Dijkstra算法3.3.2 Floyd-Warshall算法 3.4 最小树算法3.4.1 Prim算法3.4.2 Kruskal算法4.散列数据结构4.1 散列表4.1.1 基本概念4.1.2 散列函数的设计与应用 4.1.3 碰撞解决方法4.2 布隆过滤器4.2.1 基本原理4.2.2 应用场景4.3 哈希算法4.3.1 基本概念4.3.2 常见的哈希算法5.高级数据结构5.1 树状数组(BIT)5.1.1 基本原理5.1.2 树状数组的应用5.2 线段树5.2.1 基本原理5.2.2 线段树的构建和查询操作5.3 Trie树5.3.1 基本概念5.3.2 Trie树的构建与查询5.4 并查集5.4.1 基本操作5.4.2 应用场景6.本文档涉及附件。

7.本文所涉及的法律名词及注释:7.1 数据结构:指在计算机科学中,用于存储和组织数据的方式和方式的方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一章概论1.数据:信息的载体,能被计算机识别、存储和加工处理。

2.数据元素:数据的基本单位,可由若干个数据项组成,数据项是具有独立含义的最小标识单位。

3.数据结构:数据之间的相互关系,即数据的组织形式。

它包括:1)数据的逻辑结构,从逻辑关系上描述数据,与数据存储无关,独立于计算机;2)数据的存储结构,是逻辑结构用计算机语言的实现,依赖于计算机语言。

3)数据的运算,定义在逻辑结构上,每种逻辑结构都有一个运算集合。

常用的运算:检索/插入/删除/更新/排序。

4.数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。

数据的存储结构是逻辑结构用计算机语言的实现。

5.数据类型:一个值的集合及在值上定义的一组操作的总称。

分为:原子类型和结构类型。

6.抽象数据类型:抽象数据的组织和与之相关的操作。

优点:将数据和操作封装在一起实现了信息隐藏。

7. 抽象数据类型ADT:是在概念层上描述问题;类:是在实现层上描述问题;在应用层上操作对象(类的实例)解决问题。

8.数据的逻辑结构,简称为数据结构,有:(1)线性结构,若结构是非空集则仅有一个开始和终端结点,并且所有结点最多只有一个直接前趋和后继。

(2)非线性结构,一个结点可能有多个直接前趋和后继。

9.数据的存储结构有:1)顺序存储,把逻辑相邻的结点存储在物理上相邻的存储单元内。

2)链接存储,结点间的逻辑关系由附加指针字段表示。

3)索引存储,存储结点信息的同时,建立附加索引表,有稠密索引和稀疏索引。

4)散列存储,按结点的关键字直接计算出存储地址。

10.评价算法的好坏是:算法是正确的;执行算法所耗的时间;执行算法的存储空间(辅助存储空间);易于理解、编码、调试。

11.算法的时间复杂度T(n):是该算法的时间耗费,是求解问题规模n的函数。

记为O(n)。

时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、……k次方阶O(n^k)、指数阶O(2^n)。

13.算法的空间复杂度S(n):是该算法的空间耗费,是求解问题规模n的函数。

12.算法衡量:是用时间复杂度和空间复杂度来衡量的,它们合称算法的复杂度。

13. 算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。

第二章线性表1.线性表:是由n(n≥0)个数据元素组成的有限序列。

3.顺序表:把线性表的结点按逻辑次序存放在一组地址连续的存储单元里。

4.顺序表结点的存储地址计算公式:Loc(ai)=Loc(a1)+(i-1)*C;1≤i≤n5.顺序表上的基本运算public interface List {//返回线性表的大小,即数据元素的个数。

public int getSize();//如果线性表为空返回 true,否则返回 false。

public boolean isEmpty();//判断线性表是否包含数据元素 epublic boolean contains(Object e);//将数据元素 e 插入到线性表中 i 号位置public void insert(int i, Object e) throws OutOfBoundaryException;//删除线性表中序号为 i 的元素,并返回之public Object remove(int i) throws OutOfBoundaryException;//删除线性表中第一个与 e 相同的元素public boolean remove(Object e);//返回线性表中序号为 i 的数据元素public Object get(int i) throws OutOfBoundaryException;}在顺序表上插入要移动表的n/2结点,算法的平均时间复杂度为O(n)。

在顺序表上删除要移动表的(n+1)/2结点,算法的平均时间复杂度为O(n)。

public class ListArray implements List {private final int LEN = 8; //数组的默认大小private Strategy strategy; //数据元素比较策略private int size; //线性表中数据元素的个数private Object[] elements; //数据元素数组//构造方法public ListArray (Strategy strategy){size = 0;elements = new Object[LEN];}//返回线性表的大小,即数据元素的个数。

public int getSize() {return size;}//如果线性表为空返回 true,否则返回 false。

public boolean isEmpty() {return size==0;}//判断线性表是否包含数据元素 epublic boolean contains(Object e) {for (int i=0; i<size; i++)if ( e = = elements[i]) return true;return false;}//将数据元素 e 插入到线性表中 i 号位置public void insert(int i, Object e) throws OutOfBoundaryException {if (i<0||i>size)throw new OutOfBoundaryException("错误,指定的插入序号越界。

");if (size >= elements.length)expandSpace();for (int j=size; j>i; j--)elements[j] = elements[j-1];elements[i] = e;size++;return;}private void expandSpace(){Object[] a = new Object[elements.length*2];for (int i=0; i<elements.length; i++)a[i] = elements[i];elements = a;}//删除线性表中序号为 i 的元素,并返回之public Object remove(int i) throws OutOfBoundaryException {if (i<0||i>=size)throw new OutOfBoundaryException("错误,指定的删除序号越界。

");Object obj = elements[i];for (int j=i; j<size-1; j++)elements[j] = elements[j+1];elements[--size] = null;return obj;}//替换线性表中序号为 i 的数据元素为 e,返回原数据元素public Object replace(int i, Object e) throws OutOfBoundaryException {if (i<0||i>=size)throw new OutOfBoundaryException("错误,指定的序号越界。

");Object obj = elements[i];elements[i] = e;return obj;}//返回线性表中序号为 i 的数据元素public Object get(int i) throws OutOfBoundaryException {if (i<0||i>=size)throw new OutOfBoundaryException("错误,指定的序号越界。

");return elements[i];}//删除线性表中第一个与 e 相同的元素public boolean remove(Object e) {int i = indexOf(e);if (i<0) return false;remove(i);return true;}}6.单链表:只有一个链域的链表称单链表。

在结点中存储结点值和结点的后继结点的地址,data next data是数据域,next是指针域。

(1)建立单链表。

时间复杂度为O(n)。

加头结点的优点:1)链表第一个位置的操作无需特殊处理;2)将空表和非空表的处理统一。

(2)查找运算。

时间复杂度为O(n)。

public class SLNode implements Node {private Object element;private SLNode next;public SLNode(Object ele, SLNode next){this.element = ele;this.next = next;}public SLNode getNext(){return next;}public void setNext(SLNode next){this.next = next;}public Object getData() {return element;}public void setData(Object obj) {element = obj;}}public class ListSLinked implements List { private SLNode head; //单链表首结点引用private int size; //线性表中数据元素的个数public ListSLinked () {head = new SLNode();size = 0;}//辅助方法:获取数据元素 e 所在结点的前驱结点private SLNode getPreNode(Object e){SLNode p = head;while (p.getNext()!=null)if (p.getNext().getData()==e)return p;else p = p.getNext();return null;}//辅助方法:获取序号为 0<=i<size 的元素所在结点的前驱结点private SLNode getPreNode(int i){SLNode p = head;for (; i>0; i--)p = p.getNext();return p;}//获取序号为 0<=i<size 的元素所在结点private SLNode getNode(int i){SLNode p = head.getNext();for (; i>0; i--)p = p.getNext();return p;}//返回线性表的大小,即数据元素的个数。

相关文档
最新文档