【数据结构(青岛大学 王卓)】第2章 线性表 学习笔记(十三)2.5 线性表的链式表示和实现14、2.5 线性表的链式表示和实现15、2.5 线性表的链式表示和实现16

这篇博客详细介绍了线性表的链式存储结构,包括循环链表和双向链表的概念及优缺点。讨论了头指针和尾指针表示的单循环链表,以及带尾指针循环链表的合并操作。此外,还阐述了双向链表的结构定义、双向循环链表的特点,并分析了操作的复杂度。
摘要由CSDN通过智能技术生成

目录

2.5 线性表的链式表示和实现14

1、循环链表

2、循环链表表示

(1)头指针表示单循环链表

(2)尾指针表示单循环链表

2.5 线性表的链式表示和实现15

1、带尾指针循环链表的合并

2.5 线性表的链式表示和实现16

1、双向链表

2、双向链表的结构定义

3、双向循环链表

4、双向链表结构的对称性


2.5 线性表的链式表示和实现14

1、循环链表

循环链表:是一种头尾相接的链表(即:表中最后一个结点的指针域指向头结点,整个链表形成一个环)。

优点:从表中任一结点出发均可找到表中其他结点。

备注:由于循环链表中没有NULL指针,故涉及遍历操作时,其终止条件就不再像非循环链表那样判断p或p->next是否为空,而是判断它们是否等于头指针。

循环条件:

2、循环链表表示

(1)头指针表示单循环链表

a_{1}的时间复杂度:O(1);找a_{n}的时间复杂度:O(n)。不方便。

备注:表的操作常常是在表的首尾位置上进行。

(2)尾指针表示单循环链表

a_{1}的存储位置是:R->next->next;a_{n}的存储位置是:R。时间复杂度:O(1)

2.5 线性表的链式表示和实现15

1、带尾指针循环链表的合并

带尾指针循环链表的合并(将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都是非空的单循环链表 
	p = Ta->next;//①p存表头结点 
	Ta->next = Tb->next->next;//②Tb表头连结Ta表尾 
	delete Tb->next;//③释放Tb表头结点,或free(Tb->next); 
	Tb->next = p;//④修改指针
	return Tb;
}

时间复杂度是O(1)

2.5 线性表的链式表示和实现16

1、双向链表

为什么要讨论双向链表?

单链表:

单链表的结点→有指示后继的指针域→找后继结点方便;即:查找某结点的后继结点的执行时间为O(1)

单链表的结点→无指示前驱的指针域→找前驱结点难:从表头出发查找;即:查找某结点的前驱结点的执行时间为O(n)

备注:可用双向链表来克服单链表的这种缺点。

双向链表:在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表。

2、双向链表的结构定义

双向链表的结构可定义如下:

//双向链表的结构定义
typedef struct DuLNode{
	ElemType data;
	struct DuLNode *prior, *next;
}DuLNode, *DuLinkList;

3、双向循环链表

和单链的循环表类似,双向链表也可以有循环表。让头结点的前驱指针指向链表的最后一个结点;让最后一个结点的后继指针指向头结点。

4、双向链表结构的对称性

双向链表结构的对称性(设指针p指向某一结点):p->prior->next = p = p->next->prior。

在双向链表中有些操作(如:ListLength、GetElem等),因仅涉及一个方向的指针,故它们的算法与线性链表的相同。但在插入、删除时,则需同时修改两个方向上的指针,两者的操作的时间复杂度均为O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值