链表的概念
链表是常用的基本数据结构之一,属于线性表。同属于线性表的还有顺序表,我们常说的数组就是顺序表。
带表头链表
链表的实现有带表头和不带表头两种方式。最原始的方式,也就是不带表头的实现方式,是用一个指向头结点的指针变量来记录链表的起始位置,当我们要进行插入或删除结点的操作时,必须要针对第一个结点和其它结点做出不同判断,然后用不同的代码来分别处理这两种情况。
所谓带表头的实现方式,就是用一个空的结点来作为头结点,其data域不放数据,其next指针指向第一个存有数据的结点。这样的好处是:每一个数据结点都有相同类型的前驱结点,不管在哪个位置实现操作,都能用统一的形式来表述,即可以用同样的代码来实现,而无需判断是在链表的起始位置、中间位置或者尾部位置。
实现思路
我们将实现链表类的几个基本方法:
- 添加结点(至链表末尾)
- 插入结点(至任意位置)
- 删除结点
- 查找结点
- 获取链表长度
- 获取结点数据
- 排序
链表类Linklist的定义部分
template <typename ElemType>
class Linklist {
private:
struct Node{
ElemType data;
Node* next;
Node():next(nullptr){};
Node(ElemType data, Node* next = nullptr):
data(data), next(next){};
};
Node Head;
public:
Linkli