链表基础
链表
链表是由一组不必相连【不必相连:可以连续也可以不连续】的内存结构,按特定的顺序链接在一起的抽象数据类型。是一种线性表,但是并不会按线性的顺序存储数据,而是在由一个个节点组成,节点一般包含存放数据的数据域和存放指针的指针域。
补充:
抽象数据类型(Abstract Data Type [ADT]):表示数学中抽象出来的一些操作的集合。
内存结构:内存中的结构,如:struct、特殊内存块...等等之类;
下图就是一种简单的链表
对比数组
数组是在相连的内存空间,由相同数据类型的元素组成的集合。
相同点
-
都是用来存储和操作数据的
-
都是数据结构中的线性结构
不同点
-
数组是顺序的存储结构,也就是连续的内存空间;链表是链式的存储结构,内存空间离散排列的(当然也可以是连续的)
-
链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。
-
链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难
-
数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再申请内存空间时指定,所以扩容不如链表方便
分类
一般来说,链表常用的有 3 类: 单向链表、双向链表、循环链表(单链循环,双链循环)。
单向链表
单向链表的节点由一个具体的数据域和指向下一个节点的指针域组成。所以单链表只能单向读取、查找和遍历。
双向链表
双向链表的节点由一个具体的数据域和指向上一个节点以及指向下一个节点的指针域组成。所以双向链表可以双向读取、查找和遍历。
循环链表
单向循环链表
单向循环链表和单向链表只有一个差别,就是在普通单向链表中,尾节点(最后一个节点)的next
指向的是NULL
;而在单向循环链表中尾节点(最后一个节点)的next
指向的是头结点(第一个节点)。
双向循环链表