问答题 如何实现双向循环链表的删除与插入操作
【正确答案】
【答案解析】双向循环链表是双向链表和循环链表的综合。循环链表与单链表相同,是一种链式的存储结构。所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或表头结点,从而构成一个环形的链。在双向链表中,结点除含有数据域外,更有两个链域,一个存储直接后继结点地址,一般称为右链域;一个存储直接前驱结点地址,一般称为左链域。
与单链表类似,双向链表通常也是用头指针标识,也可以带头结点和做成循环结构,图1所示为带头结点的双向循环链表示意图。

图1 带头结点的双向循环链表

通过某结点的指针P即可以直接得到它的后继结点的指针p->next,也可以直接得到它的前驱结点的指针p->prior,所以在有些操作中需要找前驱时,则必须再使用循环。例如,结点的删除操作。
设P是指向双向循环链表中的某一结点,即P是该结点的指针,则p→prior→next表示的是*P结点之前驱结点的后继结点的指针,即与P相等,而p→next→prior表示的是*p结点之后继结点的前驱结点的指针,也与P相等。
双向链表中结点的插入:设P指向双向链表中某结点,s指向待插入的值为x的新结点,将*s插入到*P的前面,插入过程如图2所示。

图2 双向链表插入操作

操作如下:
1)s→prjor=p→prior。
2)p→prior→next=s。
3)s→next=p。
4)p→prior=s。
指针操作的顺序不是唯一的,但也不是任意的,第一步操作必须要放到第四步操作之前完成,否则*P的前驱结点的指针就丢掉了。
双向链表中结点的删除:设P指向双向链表中某结点,删除*P。操作过程如图3所示。