线性表的顺序存储结构的特他点是逻辑关系上相邻的两个元素下物理位置上也相邻。而线性表的链式存储它不需要地址连续的存储空间来实现,因为他不要求逻辑相邻的两个元素物理位置也相邻,他虽然访问比较繁琐,但是插入和删除比较容易。如下是单向链表的结点结构:
在这里,我们假设L是Linklist类型的变量,那么L就是一个指针,他只想表中的第一个结点。结点类型LNode,LinkList是是指向LNode类型结点的指针类型。
1.链表的分类
- 单链表(**代码实现**)
头指针和头结点的异同
头指针 | 头结点 |
---|---|
指向第一个结点的指针,若链表有头结点,则是指向头结点的指针 | 放在第一个元素之前,其数据域一般无意义(也可以存放链表的长度) |
具有表示作用,常用头指针作为链表的名字 | 有了头结点在第一个元素结点之前插入和删除第一个结点的操作就统一了 |
----- | 造成了空间浪费 |
不带头结点的单链表中每个节点的存储地址是存放在其前驱节点的指针域中的,第一个无前驱,最后一个无后继。
在线性链表的第一个结点之前加上一个成为头结点的结点。头结点的数据域可以不存放任何数据,也可以存放链表的结点个数信息。设置表头结点的目的是简化链表操作的实现。
带头结点的非空单链表:
带头结点的空单链表:
不带头结点和带头结点链表的区别
不带头结点 | 带头结点 |
---|---|
链表为空:L==NULL为真 | 链表为空:L->next==NULL为真 |
链表的第一个数据元素由L指向 | 链表的第一个元素由L->next指向 |
头插和头删时要单独处理,与其他地方的插入和删除操作不同 | 插入和删除操作相同 |
- 循环单链表
对于单链表最后一个结点的指针域是空指针,如果将最后一个结点的指针域指向表头结点,则是的链表的头,尾结点相连接,就构成了循环单链表。
非空表:
空表:
- 双向链表
双向链表中结点的结构:
非空双向链表:
单向链表只有一个方向,节点中只有一个后继指针next指向后面的节点,而双向链表,它支持两个方向,每个节点有一个后继指针,同时还有一个前去指针prev指向前面的结点。
- 带头结点的循环双向链表(实现代码)
如果了解了循环链表和双向链表,那么双向循环链表就是将他们整合在一起。