【建立单链表:头插法,尾插法;循环列表,带尾指针的循环链表合并(将Tb合并在Ta之后)】

一、单链表的基本操作的实现

1.建立单链表:头插法----元素插入在链表头部,也叫头插法。

1.从一个空表开始,重复读取数据。
2.生成新结点,将读入数据存放到新结点的数据域中。
3.从最后一个结点开始,依次将各结点插入到链表的最前端。
在这里插入图片描述

void CreateList(LinkList& L, int n) {
	L = new LNode;
	L->next = NULL;//先创建一个带头结点的单链表
	LinkList p;
	int i;
	for (i = n; i > 0; --i) {
		p = new LNode;//生成新结点p = (LNode*)malloc(sizeof(LNode));
		cin >> p->data;//输入元素值scanf(&p->data);
		p->next = L->next;
		L->next = p;
	}
}

2.建立单链表:尾插法----元素插入在链表尾部,也叫尾插法。

1.从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点。
2.初始时,r同L均指向头结点。每读入一个数据元素则申请一个新结点,将新结点插入到尾结点后,r指向新结点。
在这里插入图片描述

void CreateList(LinkList& L, int n) {
	L = new LNode;
	L->next = NULL;
	int i;

	LinkList r = L;//尾指针r指向头结点
	for (i = 0; i < n; ++i) {
		LinkList p = new LNode;
		cin >> p->data;//生成新结点,输入元素值
		p->next = NULL;
		r->next = p;//插入到表尾
		r = p;//r指向新的尾结点

	}
}

二、线性表的链式表示和实现

1.循环列表

循环列表:是一种头尾相连的链表(即:表中的最后一个结点的指针域指向头指针,整个链表形成一个环)。
在这里插入图片描述
优点:从表中任一结点出发均可找到表中的其他结点。
注意:由于循环指针没有NULL指针,故涉及遍历操作时,其终止条件就不再像非循环链表那样判断p或p->next是否为空,而是他们是否等于头指针。
p != L;
P -> next != L;

头指针表示单循环链表:①找a1的时间复杂度:O(1);②找an的时间复杂度:O(n)。
注意:表的操作常常在表的首尾进行。
尾指针表示单循环链表:①a1的存储位置:R->next->next;
②an的存储位置是:R。时间复杂度都是O(1)。

2.带尾指针的循环链表合并(将Tb合并在Ta之后)

在这里插入图片描述
分析的操作:
①p存表头结点(p=Ta->next)
②Tb表头连接在Ta表尾(Ta->next = Tb->next->next)
③释放Tb表结点(delete Tb->next)
④修改指针(Tb->next = p)

LinkList Connect(LinkList Ta, LinkList Tb) {
	//假设Ta和Tb都是非空的单循环链表
	LinkList p;
	p = Ta->next;//p存表头结点
	Ta->next = Tb->next->next;//Tb表头连接Ta表尾
	delete Tb->next;//释放Tb的头结点
	Tb->next = p;//修改指针
	return Tb;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值