单链表建立——头插法和尾插法

引言

当我们准备采用单链表形式实现线性表,第一步就是要建立单链表,即初始化。由于链表是一个动态结构,不需要预先分配空间,因此生成链表的过程就是“逐个插入”的过程,插入结点的位置可以让我们自由选择,故有了“头插法”和“尾插法”这两种方法。

1、头插法(前插法)

课本的解释:通过将新结点逐个插入链表的头部(头节点之后)来创建链表,每次申请一个新结点,读入相应的数据元素值,然后将新结点插入到头结点之后。

重点:每次生成的新结点都是要与头结点相连接的,每个新结点都插在了原来第一个结点的前面。通过这种方法建立的链表是后来居前的,即链表是逆序的。因此,若有题目要求实现线性表的逆序表示,首先考虑头插法。在这里插入图片描述

在这里插入图片描述

指针H始终指向头结点,指针s指向新结点。
①表示初始化空表 ②表示申请新结点并赋值 ③表示插入第一个结点 ④表示插入第二个结点

算法描述:

void CreateList(LinkList &L, int n)
{
	L=new LNode;
	L->next=NULL;      //建立带头结点的空表 
	for(int i=0;i<n;i++)
	{
		p=new LNode;          //生成新结点 
		cin>>p->data;         //输入元素值赋给新结点*p的数据域 
		p->next=L->next;      //这一步和下一步是将新结点*p插入到头结点子之后 
		L->next=p;
	}
}

时间复杂度:O(n)

2、尾插法(后插法)

课本的解释:通过将新结点逐个插入到链表的尾部来创建链表。同前插法一样,每次申请一个新结点,读入相应的数据元素值。不同的是,为了使新结点能够插入到表尾,需要增加一个尾指针 r 指向链表的尾结点。

重点:生成的一个新结点是直接插入当前链表的尾部,也就是让原来最后一个结点指向该新结点。这也是链表长度增长的一种最基本的方式。通过这种方法建立的链表是后来居后的,即链表是顺序的。一般情况下使用尾插法更方便在这里插入图片描述

在这里插入图片描述

其中指针H始终指向头结点,指针s指向新结点,指针r始终指向单链表的表尾。
①表示初始化空表 ②表示申请新结点并赋值 ③表示插入第一个结点 ④表示插入第二个结点

算法描述:

void CreateList(LinkList &L, int n)
{
    L = new LNode;
    L->next = NULL; // 建立带头结点的空表
    LinkList r = L; // 尾指针r指向头结点

    for (int i = 0; i < n; i++)
    {
        LinkList p = new LNode; // 生成新结点
        cin >> p->data;         // 输入元素值赋给新结点*p的数据域
        p->next = NULL;         // 新结点的next初始化为NULL
        r->next = p;            // 将新结点*p插入到尾结点r之后
        r = p;                  // 更新r指向新的尾结点*p
    }
}

时间复杂度:O(n)

  • 22
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值