目录
2.5.3 循环链表
所以一般操作有尾指针的循环链表。
算法思想:
LinkList Connect(LinkList Ta, LinkList Tb){
// 假设Ta、Tb都是非空的单循环链表
p = Ta -> next; // ①p存表头结点
Ta -> next = Tb -> next -> next; // ②Tb表头连结Ta表尾
delete Tb -> next; // ③释放Tb表头结点
Tb -> next = p; // ④修改指针
return Tb;
}
时间复杂度是O(1)。
2.5.4 双向链表
1. 双向链表结构:
prior | data | next |
2. 定义:
typedef struct DuLNode{
Elemtype data;
struct DuLNode *prior; *next;
}DuLNode, *DuLinkList;
3. 对称性
(1)双向链表的插入
算法思想:
void ListInsert_DuL(DuLinkList &L, int i, ElemType e){
// 在带头结点的双向循环链表L中第i个位置之前插入元素e
if(!(p=GetElemP_DuL(L, i)))
return ERROR;
s = new DuLNode;
s -> data = e;
s -> prior = p -> prior;
p -> prior -> next = s;
s -> next = p;
p -> prior = s;
return OK;
} // ListInsert_DuL
(2)双向链表的删除
算法思想:
void ListDelete_DuL(DuLink &L, int i, ElemType &e){
// 删除带头结点的双向循环链表L的第i个元素,并用e返回
if(!(p = GetElemP_DuL(L, i)))
return ERROR;
e = p -> data;
p -> prior -> next = p -> next;
p -> next -> prior = p -> prior;
free(p);
return OK;
} // ListDelete_DuL
2.5.6 单链表、循环链表、双向链表时间效率的比较
为什么带头节点的双向循环链表有较好的时间效率呢?
因为其牺牲了空间,每个结点都添加了指向前驱的指针域。
2.6 顺序表和链表的比较
2.6.1 链式优缺点
(1)存储密度