1.数组
数组使用一块连续的内存来存储元素,并且元素的类型都是相同的。可以通过索引来访问。
2.链表
链表由一系列节点组成,每个节点包含两部分:数据部分和指针部分。数据部分用于存储元素的值,指针部分则指向下一个节点。没有使用连续的内存空间来存储数据。
在知道目标位置元素的上一个元素的时候,链表的插入和删除操作的复杂度为 O(1) 。但是,在查找一个节点或者访问特定位置的节点的时候复杂度为 O(n) 。
常见链表有:单链表、双向链表、循环链表、双向循环链表
单链表
单链表只有一个方向,结点只有一个后继指针 next 指向后面的节点。因此,链表这种数据结构通常在物理内存上是不连续的。我们习惯性地把第一个结点叫作头结点,链表通常有一个不保存任何值的 head 节点,通过头结点我们可以遍历整个链表。尾结点通常指向 null。
循环链表
循环链表其实是一种特殊的单链表,和单链表不同的是循环链表的尾结点不是指向 null,而是指向链表的头结点。
双向链表
双向链表包含两个指针,一个 prev 指向前一个节点,一个 next 指向后一个节点。
双向循环链表
双向循环链表最后一个节点的 next 指向 head,而 head 的 prev 指向最后一个节点,构成一个环。
3.栈
栈 (Stack) 只允许在有序的线性数据集合的一端(称为栈顶 top)进行元素的添加(push)和删除(pop)。因而按照后进先出(LIFO,Last In First Out)的原理运作。在栈中,push 和 pop 的操作都发生在栈顶。
栈常用一维数组或链表来实现,用数组实现的栈叫作 顺序栈 ,用链表实现的栈叫作 链式栈 。
4.队列
队列是先进先出 (FIFO,First In, First Out) 的线性表。在具体应用中通常用链表或者数组来实现,用数组实现的队列叫作顺序队列 ,用链表实现的队列叫作链式队列。队列只允许在队尾进行插入操作,在队首进行出队。
单队列
单队列就是常见的队列, 每次添加元素时,都是添加到队尾。单队列又分为顺序队列(数组实现)和链式队列(链表实现)。
循环队列
循环队列在逻辑上是一个循环的队列,可以利用数组实现。循环队列解决了普通队列在出队操作时导致的队列空间浪费的问题。
双端队列
双端队列是一种在队列的两端都可以进行插入和删除操作的队列,相比单队列来说更加灵活。
优先队列
优先队列从底层结构上来讲并非线性的数据结构,它一般是由堆来实现的。在入队和出队时有以下特点。
-
在每个元素入队时,优先队列会将新元素插入堆中并调整堆。
-
在队头出队时,优先队列会返回堆顶元素并调整堆。