目录
2.5 线性表的链式表示和实现14
1、循环链表
循环链表:是一种头尾相接的链表(即:表中最后一个结点的指针域指向头结点,整个链表形成一个环)。
优点:从表中任一结点出发均可找到表中其他结点。
备注:由于循环链表中没有NULL指针,故涉及遍历操作时,其终止条件就不再像非循环链表那样判断p或p->next是否为空,而是判断它们是否等于头指针。
循环条件:
2、循环链表表示
(1)头指针表示单循环链表
找的时间复杂度:;找的时间复杂度:。不方便。
备注:表的操作常常是在表的首尾位置上进行。
(2)尾指针表示单循环链表
的存储位置是:R->next->next;的存储位置是:R。时间复杂度:。
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;
}
时间复杂度是。
2.5 线性表的链式表示和实现16
1、双向链表
为什么要讨论双向链表?
单链表:
单链表的结点→有指示后继的指针域→找后继结点方便;即:查找某结点的后继结点的执行时间为。
单链表的结点→无指示前驱的指针域→找前驱结点难:从表头出发查找;即:查找某结点的前驱结点的执行时间为。
备注:可用双向链表来克服单链表的这种缺点。
双向链表:在单链表的每个结点里再增加一个指向其直接前驱的指针域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等),因仅涉及一个方向的指针,故它们的算法与线性链表的相同。但在插入、删除时,则需同时修改两个方向上的指针,两者的操作的时间复杂度均为。