链表,是最基础的数据结构之一,其存储空间的不连续性以及便捷的添加节点和删除节点的优点让其应用颇广。今天主要谈一谈链表的一些基础也是核心算法,即链表的增删改查以及链表反转(reverse)。
1. 节点结构
由于用C++描述,我们直接就定义为结点类。如果用单纯的C语言的话可以把它换成Struct结构体。
class Node{
public:
int element;
Node *link;
};
还有两个成员变量,一个为int element,用来存放数据,即数据域(当然数据类型可以不光是int,这个可以根据实际需求进行调整)。另外一个为Node *link,即地址域,用来存放下一个结点的地址。
2. 链表的分类
链表分为单链表和双向链表。
单链表可分为不带表头节点的单向链表和带有表头节点的单向链表。
我们先来看单链表。
2.1单链表
2.1.1不带表头节点的单链表
结构如下图所示。first节点称为头指针,头指针是管理单链表的基础。头指针指向第一个元素A0所在的节点(头节点)。弱头指针为空,则称此链表为空链表。尾节点没有后继,故其link域为NULL。剩下的每个节点的link域均存放下一个节点的地址。
(PS: 请大家一定注意区分,头指针和头节点)
链表的结构看上去非常简单,那么它的基本算法其实也是十分清晰明了的。
整个链表类(SingleList)的构成
class Singlelist{
private:
Node *first;
int length;
public:
Singlelist()
{
first =NULL;
length= 0;
}
~Singlelist()
{
Node *p;
while (first)
{
p =first->link;
delete first;
first= p;
}
}
bool Insert();
bool Delete();
bool Update();
bool Find();
Node* reverse();
}
Singlelist类共有两个成员变量。一个为Node* first。用于存放链表的头指针。另一个为int length. 用来记录链表的长度。