双向链表
单链表查找某结点的后继结点的执行时间为O(1);单链表查找某结点的后继结点的执行时间为O(n)
在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链
双向链表具有对称性:p->next->prior=p=p->prior->next
双向链表插入、删除时,须同时修改两个方向的指针时间复杂度均为O(n)
双向链表的定义
typedef struct Dulnode{
int data;
struct Dulnode *prior,*next;
}DulNode,*DuLinkList;
双向循环链表
- 让头结点的前驱指针指向链表的最后一个结点
- 让最后一个结点的后继指针指向头结点
双向链表的插入
- s->prior=p->prior;
- p->prior->next=s;
- s->next=p;
- p->prior=s;
DuLinkList GetElemP_Dul(DuLinkList L,int i){
DuLinkList p;
p=L->next;
int j=1;
while (p&&j<i){
p=p->next;
j++;
}
if(!p||j>i) return 0;
return p;
}
int ListInsert_Dul(DuLinkList L,int i,int e){
DuLinkList p,s;
s=(DuLinkList)malloc(sizeof(DulNode));
if(!(p=GetElemP_Dul(L,i))) return 0;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return 1;
}
双向链表的删除
删除带头结点的双向循环链表L的第i个元素,用e返回;
p->prior->next=p->next;p->next->prior=p->prior;
int ListDelete_Dul(DuLinkList L,int i,int *e){
DuLinkList p;
if(!(p=GetElemP_Dul(L,i))) return 0;
*e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return 1;
}
时间复杂度O(1)
标签:结点,DuLinkList,int,next,链表,prior,双向 From: https://www.cnblogs.com/yuanyu610/p/17077278.html