带头结点的单链表

定义

线性表的链式存储方式称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。

为了实现数据元素之间的线性关系,所以每个结点中除了存储自身的值以外,还会存放一个指向后继的指针。

具体的代码如下:

typedef struct LNode{
   
	int data;//结点的数据
	LNode* Next;//指向下一结点的指针
}LNode,*LinkList;//前者为结点,后者为链表(只是两种不同表述方式)

操作

在单链表的具体实现中,有两种实现方式,一种是带头结点的单链表,一种是不带头结点的单链表。

两者的共同点在于,都有一个头指针用于指向链表的第一个结点。

两者的区别在于,带头结点的单链表会有一个头结点,这个头结点的Next指针指向单链表的第一个结点,所以头指针是指向头结点的;而不带头结点的单链表则是由头指针直接指向第一个结点。

因为带头结点的单链表在代码实现的时候更加简便,所以本文以带头结点的形式来实现单链表各种操作。

初始化

bool InitList(LinkList& L)
{
   
	L = (LNode*)malloc(sizeof(LNode));//创建头结点
	if (L == NULL)
	{
   
		cout << "内存不足分配失败!" << endl;
		return false;
	}
	else
	{
   
		L->next = NULL;//初始化的链表中没有结点,所以指向NULL
		return true;
	}
}

在初始化时,要注意使用malloc函数的判空,因为使用malloc时可能会出现失败的情况,加入判空可以增加代码的健壮性。

结点前插

给定链表的一个结点,实现在此结点的前面插入一个结点,有两种实现方式。
第一,从头开始找到该结点的前驱结点实现插入(这种实现方式需要我们知道头指针,并且时间复杂度为O(n))
第二,原地前插

bool InsertPriorNode(LNode* p, int e) {
   //在p结点前面插入元素e
	if (p == NULL) {
   //判断p结点是否为空,如果为空是不能前插的
		return false;
	}
	LNode* L = (LNode*)malloc(sizeof(LNode));
	if (L == NULL) {
   
		cout << "内存分配失败" << endl;
		return false;
	}
	else {
   
		L->next = p->next;//新结点连入
		p->next = L;//前链连接上新结点
		L->data = p->data;//数据交换,实现前插
		p->data = e;
		return true;
	}
}

在这种前插方式下,时间复杂度为O(1),而且不需要知道头指针

如果给定的是需要前插的不是值,而是结点,具体的实现代码如下:

bool Ins
  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值