一、链表概念。
链表是由一系列结点组成的
线性结构。每个结点包括两部分: 一个存储数据元素的
数据域,另一个是存储下一个结点地址的
指针域。数组的线性顺序是由数组
下标决定的,而链表的线性是由各个
节点里的
指针决定的。因此链表在内存上
不连续,也不需要提前预估链表的元素个数。
二、链表的存储方式。
非空链表的第一个结点称为表头。从链表头开始,可以按照存储在每个结点中的后继指针访问链表中的其余结点。最后一个结点中的后继指针被设置为空,以指示链表的结束。
注意,图中绘制的链表结点彼此非常接近,排列整齐。实际上,链表结点可能散布在内存的各个部分。
三、链表的访问。
链表元素在内存上不必连续,插入、删除某个元素只需 O(1)无需事先预估链表容量,但不可随机访问某个元素。
四、链表的删除和插入。
链表的删除很简单只需要把要删除的前一个数的指针改成要删除的下一个的地址就行了。
例如把4删除,就把3的指针指向5,这样访问的时候就不会访问到4了。
链表的插入也很简单,只需要把插入的数前面的一个数的指针指向插入的数的地址,插入的数的指针指向插入的数前面的一个数原来的指针就行了。
例如要插入7,如图,只需要把5的指针指向7,把7的指针指向6就可以了。
五、链表的创建和函数的引用。
#include <list> // 引入头文件双向链表
#include <forward_list> // 引入头文件单向链表
list<int> ls; // 定义双向链表list(int形式)
forward_list<int> ls; // 定义单向链表forward_list(int形式)
函数名 | 含义 |
---|---|
ls.push_front(x)
|
向ls开头添加x
|
ls.push_back(x)
|
向ls结尾添加x
|
ls.front()
|
返回ls开头元素
|
ls.back()
| 返回ls结尾元素。 |
ls.pop_front()
|
删除ls开头元素
|
ls.pop_back(); | 删除ls结尾元素 |
ls.size()
| ls中的元素个数 |
ls.resize(n) | 将ls的大小变为n |
ls.clear()
| 清空链表 |
ls.empty() | 判断ls是否为空容器,若空则返回true |
ls.insert(pos, x)
|
在指定迭代器位置pos前插入元素x
|
pos = ls.erase(pos)
|
删除指定迭代器位置的元素
并返回下一个元素的迭代器
|
ls.sort(
[cmp]
)
|
对list进行排序,
默认为升序排序
可传入排序规则cmp函数
|
ls.reverse()
| )反转列表元素顺序 |
ls.unique()
|
删除连续的重复元素
|
作者10岁的小Tyler