链表是一种特殊的存储结构,数组使用一段连续的空间存储数据,所以访问比较方便(如,访问第3个元素直接查找下表尾2的元素就好),但使删除元素就会特别麻烦(比如删除第一个元素就会导致剩下的元素全部前移一位,时间复杂度尾n)。
链表是将一系列散点连成一条线存储数据,删除某点的时候直接删除当前点,将此点前一个点连接到后一个点即可。
双端队列实现:
节点类型
struct node{ int key; node *prev,*next; };
初始化
node *nil; void init(){ nil=(node *)malloc(sizeof(node)); nil->next=nil; nil->prev=nil; }
插入元素
void insert(int key){ node *x=(node *)malloc(sizeof(node)); x->key=key; x->next=nil->next; nil->next->prev=x; nil->next=x; x->prev=nil; }
搜索元素
node* listsearch(int key){ node *cur=nil->next; while(cur!=nil&&cur->key!=key){ cur=cur->next; } return cur; }
删除元素
void deletenode(node *t){ if(t==nil)return; t->prev->next=t->next; t->next->prev=t->prev; free(t); } void deletefirst(){ deletenode(nil->next); } void deletelast(){ deletenode(nil->prev); } void deletekey(int key){ deletenode(listsearch(key)); }
例;模拟链表操作
输入:
7
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5
输出:
6 1 2
注释:命令部超过2000000,删除次数部超过20,命令过程中元素不超过10
代码:
#include<algorithm> #include<iostream> #include<cstdlib> #include<fstream> #include<cstring> #include<bitset> #include<cstdio> #include<time.h> #include<deque> #include<queue> #include<stack> #include<cmath> #include<map> #include<set> using namespace std; struct node{ int key; node *prev,*next; }; node *nil; void init(){ nil=(node *)malloc(sizeof(node)); nil->next=nil; nil->prev=nil; } void printflist(){ node *cur=nil->next; int isf=0; while(1){ if(cur==nil)break; if(isf++>0)printf(" "); printf("%d",cur->key); cur=cur->next; } printf("\n"); } void insert(int key){ node *x=(node *)malloc(sizeof(node)); x->key=key; x->next=nil->next; nil->next->prev=x; nil->next=x; x->prev=nil; } node* listsearch(int key){ node *cur=nil->next; while(cur!=nil&&cur->key!=key){ cur=cur->next; } return cur; } void deletenode(node *t){ if(t==nil)return; t->prev->next=t->next; t->next->prev=t->prev; free(t); } void deletefirst(){ deletenode(nil->next); } void deletelast(){ deletenode(nil->prev); } void deletekey(int key){ deletenode(listsearch(key)); } int main(){ int key,n,i; int size=0; char com[20]; int np=0,nd=0; scanf("%d",&n); init(); for(i=0;i<n;i++){ scanf("%s%d",com,&key); if(com[0]=='i'){ insert(key); np++; size++; }else if(com[0]=='d'){ if(strlen(com)>6){ if(com[6]=='F')deletefirst(); else if(com[6]=='L')deletelast(); }else{ deletekey(key); nd++; } size--; } } printflist(); return 0; }