在每个节点增加一个指向前驱的指针,就可以实现双向查找。查找第一个和最后一个节点的时间复杂度 都可以达到 O(1)
其他操作和单链表类似;插入、删除、查找 等。
在实现的时候一定要注意指针的向后循序:
#include<iostream>
#include<cstdio>
using namespace std;
typedef struct node{
int va;
struct node *prior;///前驱
struct node *next;///后继
}DUlinklist;
DUlinklist *InitDUlinklist(){
DUlinklist *L;
L=(DUlinklist*)malloc(sizeof(DUlinklist));
L->prior=L;
L->next=L;
return L;
}
void InsertBefore(DUlinklist *p,int x){///在P节点前面插入
DUlinklist *s;
s=(DUlinklist*)malloc(sizeof(DUlinklist));
s->va=x;
s->next=p;
s->prior=p->prior;
p->prior->next=s;
p->prior=s;
}
void InsertAfter(DUlinklist *p,int x){///在P节点后插入
DUlinklist *s;
s=(DUlinklist*)malloc(sizeof(DUlinklist));
s->va=x;
s->next=p->next;
s->prior=p;
if(p->next!=NULL)
p->next->prior=s;
p->next=s;
}
void DeleteNOde(DUlinklist *p){///删除双向链表 的P节点
if(p!=NULL){
p->next->prior=p->prior;
p->prior->next=p->next;
free(p);
}
}
void Display_Next(DUlinklist*p){
DUlinklist *q;
q=p->next;
while(q!=p){
cout<<q->va<<" ";
q=q->next;
}
cout<<endl;
}
void Display_Proir(DUlinklist*p){
DUlinklist *q;
q=p->prior;
while(q!=p){
cout<<q->va<<" ";
q=q->prior;
}
cout<<endl;
}
DUlinklist * GET(DUlinklist *p,int x){///获取为x的节点
DUlinklist *q;
q=p->next;
while(q!=p&&q->va!=x)
q=q->next;
if(q!=NULL)
return q;
else
return NULL;
}
int Length(DUlinklist *p){///获取链表长度
DUlinklist *q;
q=p->next;
int k=0;
while(q!=p){
k++;
q=q->next;
}
return k;
}
int main()
{
DUlinklist *t=InitDUlinklist();
int n,i;
cin>>n;
for(i=1;i<=n;i++){
InsertAfter(t,i);///后插
// InsertBefore(t,i);//前插
}
Display_Next(t);
DUlinklist *s=GET(t,5);///获取值为5 的节点
DeleteNOde(s);
Display_Proir(t);///删除后打印
int len=Length(t);
cout<<len<<endl;
return 0;
}