数据结构
5.双链表、循环链表
双链表
- 如果某链表经常进行查找结点前驱的操作,我们希望查找前驱的时间复杂度也达到O(1),这时可以用空间换时间:即每个结点再增加一个指向前驱的指针域prior,使链表可以进行双向查找,这种链表称为双向链表。
- 每个结点附加了两个指针字段,如prior/pre和next
深刻理解双向链表,
指向双链表某结点的指针为p;问:
p->prior->next==?;
P->next->prior==?;
答:
p->prior->next == P->next->prior == p;
在p前插入s
s->prior=p->prior;//①p原先的前驱成为s的前驱
p->prior->next=s; //②s成为p原先的前驱的后继
s->next=p; //③s的后继是p
p->prior=s; //④修改p的前驱为s(这条语句必须在使用了p->prior的后面,以防止p->prior被修改而使链表发生断裂)
(先让 s的前后继 和 p与p的前继 连上,再从p弯弯绕绕最远的地方开始改,陆续和s相连,即p->pre->next=s,p->pre=s)
删除p
p→prior→next=p→next;
p→next→prior=p→prior;
delete p;
单循环链表
通常单循环链表不带头结点,且往往只设尾指针,
如下图所示,用一个指向尾结点的尾指针来标识单循环链表,好处是既方便查找表尾结点又方便查找首元结点
双循环链表
双循环链表头结点的prior字段给出尾结点的地址,
尾结点的next字段给出头结点的地址