双向链表
双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。
注意:
链表由头指针head惟一确定的。
带头结点的双链表的某些运算变得方便。
将头结点和尾结点链接起来,为双(向)循环链表。
双向链表的结点结构和形式描述
结点结构(见上图)
形式描述如下:
typedef char ElemType;
struct NodeType2
{
ElemType data;
NodeType2*next,*prior;
};
NodeType2*p,*q,*s;
双向链表的前插和删除本结点操作
由于双链表的对称性,在双链表能能方便地完成各种插入、删除操作。
1、双链表的前插操作
代码:
{
s->next=p;
s->prior=p->prior;
p->prior->next=s;
p->prior==s;
}
2、 双链表上删除结点*p自身的操作
代码:
{
p->prior->next=p->next
p->next->prior=p->prior;
free(p);
}
上述两个算法的时间复杂度均为O(1)。