循环链表中没有NULL指针
表的操作常常是在表的首尾位置上进行
常常用尾指针表示单循环链表
(a1的存储位置是:R->next->next;an的存储位置是:R)
举个例子:带尾指针循环链表的合并(将Tb合并在Ta之后)
有哪些操作:
p存表头结点;
Tb表头连接到Ta表尾;
释放Tb表头结点;
修改指针;
双向链表
双向链表:在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,
这样链表中就形成了有两个方向不同的链,故称为双向链表。
首元结点的前一个结点是头结点,再往前就没有结点了,所以头结点没有指向前面的指针域prior。
双向循环链表
(1)让头节点的前驱指针指向链表的最后一个结点
(2)让最后一个结点的后继指针指向头结点
双向链表的对称性
求链表的长度:一根链就可以找到
求某个结点:一根链就可以做到
插入和删除时,与单链表不同,这时需同时修改两个方向上的指针,这两个操作的时间复杂度都均为O(n)
双向链表的插入:(四步) O(n)
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
双向链表的删除 O(n)
a结点的后继应变为b结点
b结点的前驱应变为a结点