- 线性表:线性表是最基本的,最常见的一种数据结构。
1.1 前驱元素:若A元素在B元素的前面,则称A为B的前驱元素。后继元素:若B元素在A元素的后面,则称B为A的后继元素。
1.2 线性表的特征:数据元素之间只有一对一的关系。
第一个数据元素没有前驱,这个数据元素叫头结点。
最后一个数据元素没有后继,这个数据元素叫尾结点。
1.3 线性表的分类:线性表分为两种不同的存储数据的方式,顺序表和链表。
- 顺序表:顺序表是在计算机中已数组的形式方式进行存储。
2.1:一般作为容器存储数据,都需要向外部遍历的方式。
2.2:遍历的方式有两种方法:重写iterator方法,和实现Iterator接口,重写hasNext方法和next方法。
2.3顺序表的时间复杂度如下:
-
不论数据元素量N有多大,只需要get(i)一次就拿到对的元素,所以时间复杂度为O(1)。
-
每一次插入,都需要把i的位置后面的元素移动一次,随着元素N的增大,移动的元素也越多,时间复杂度为O(n)。
-
每一次删除,都需要把i的位置后面的元素移动一次,随着元素的N的增大,移动的元素也越多,时间复杂度O(n)。
-
由于顺序表的底层由数组实现,数组的长度是固定的,所以在操作的过程中涉及到了容器扩容操作。这样会导致顺 序表在使用过程中的时间复杂度不是线性的,在某些需要扩容的结点处,耗时会突增,尤其是元素越多,这个问题 越明显。
2.4 java中的Arraylist,底层就是顺序表,使用数组的方式实现,提供了增删改的和扩容的功能。
- 链表:链表是一种物理存储单元上非连续,非顺序的存储结构,链表由一系列的结点组成,链表的每一个元素都可以是一个结点,结点可以在运行时动态生成。
3.1单向链表:单向链表是链表的一种,它是由多个结点组成的,每一个结点由一个数据域和一个指针域组成,数据域是用来存储数据,指针域是用来指向下一个结点,头结点的数据域不存储数据,尾结点的指针域是空的。
3.2双向链表:双向链表也是叫双向表,也是链表的一种,也是由多个结点组成的,每一个结点由一个数据域和两个指针域组成的,数据域是用来存储数据,两个指针域是用来指向上一个结点和下一个结点,头结点没有指向上一个结点也不存储数据,尾结点没有指向一下一个结点但是它指向上一个节点和存储数据域。
3.3 java中LinkedList也是使用双向链表的,并提供增删改等方法。
3.4 链表的复杂度如下 :
- 每一次查询都需要从链表的头部开始一次向后查找,随着数据元素N的增多比较的元素越多时间复杂度为O(n)。
- 每一次插入需要找到i位置的前一个元素,然后在插入数据,随着数据元素的增多,查找的元素越多,时间复杂度为O(n)。
- 每一次移除需要找到i位置的前一个元素,然后在移除数据,随着数据元素的增多,查找的元素越多,时间复杂度为O(n)。
- 相对顺序表,链表的查询操作性能会比顺序表低。因此,我们在查询较多的情况下使用顺序表,增删操作比较多的情况下使用链表操作。
- 栈:栈是一种先进后出的数据结构,是一种只能在一端进行插入和删除操作的特俗线性表。它按照先进后出的原则存储数据,先进的数据会被压在最底的栈,后进的数据会在最上的顶栈。读取数据的时候会先从栈顶先弹出直到底栈,我们称数据进入到栈的动作叫压栈,数据出栈叫弹栈。
- 队列:队列是一种基于先进先出的数据结构,是一种在一端进行插入,在另一端进行删除操作的特殊线性表,它按照先进先出的规则存储数据,先进的数据会被先读取到的,最后进的数据到最后才被读取到。