数据结构之线性表(五)——单链表(4 单链表的建立)

建立单链表的方法有两种:头插法和尾插法

头插法建立单链表

头插法:元素插入到链表头部,也叫前插法。

  • 算法步骤:
    • 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} ai1

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)

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值