建立单链表的方法有两种:头插法和尾插法。
头插法建立单链表
头插法:元素插入到链表头部,也叫前插法。
- 算法步骤:
- 1.从一个空表开始,重复读入数据。
- 2.生成新结点,将读入数据存放到新结点的数据域中。
- 3.从最后一个结点开始,依次将各结点插入到链表的前端。
- 例子:
建立链表L (a,b,c,d,e)
从线性表中最后一个元素开始,依次插入到链表的前面。 - 具体做法:
1.建立头节点。L = new LNode; //头节点指针 L->next = NULL; //头结点的指针域为空
2.创建一个新结点,并将新结点的数据域赋最后一个数据元素的值。
p = new LNode; //创建指向最后一个结点(a[i-1])的指针
p->data = a_n; //该指针的数据域存放最后一个元素的值
3.将最后结点p放在所有的已插入的结点之前(因为p是最后的结点,所以在它后面没有结点,指针域为空),并且将最后结点p放在头节点之后。
p->next = L->next; //将当前结点放在已插入的所有结点之前,若p指向最后一个元素,则为空(不冲突,也可以这样表示)
L->next = p; //将当前结点放在头节点之后
4.创建一个结点p,指向
a
i
−
1
a_{i-1}
ai−1。
p = new LNode; //创建指向a[i-2]元素的指针
p->data = a_n-1; //该指针的数据域存放a[i-2]元素的值
5.将当前结点p放在所有的已插入的结点之前,并且将当前结点p放在头节点之后。
p->next = L->next; //将当前结点放在已插入的所有结点之前
L->next = p; //将当前结点放在头节点之后
6.依次循环第4步和第5步,直到线性表中的第一个元素插入到链表中为止。
- 算法描述:
void CreateList_H(LinkList& L, int n)
{
L = new LNode;
L->next = NULL; //创建一个带头节点的单链表
for (i = n; i > 0; --i)
{
p = new LNode; //生成新结点p
cin >> p->data; //输入元素值,赋值到当前结点的指针域里
p->next = L->next; //将结点p插入到表头(放在已建立链表的前面)
L->next = p; //将结点p放到头节点的后面
}
}
该算法的时间复杂度为 O ( n ) O(n) O(n)。
尾插法建立单链表
尾插法:元素插入到链表尾部,也叫后插法。
-
算法步骤:
- 1.从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点。
- 2.初始时,r和L均指向头结点。每读入一个数据元素则申请一个新结点,将新结点插入到尾结点之后,并且尾指针r指向新结点。
-
具体做法:
1.新建一个结点,如下图,
2.新结点p接在尾指针之后。
3.设置结点p为新的尾结点。
-
算法描述:
void CreateList_R(LinkList& L, int n)
{
L = new LNode;
L->next = NULL; //创建一个带头节点的单链表
r = L; //尾指针r指向头结点
for (i = 0; i < n:++i)
{
p = new LNode; //生成新结点
cin >> p->data; //输入元素值
p->next = NULL;
r->next = p; //插入到表尾
r = p; //把p设置为尾结点
}
}
该算法的时间复杂度为 O ( n ) O(n) O(n)。