链表是一种特殊的存储结构,数组使用一段连续的空间存储数据,所以访问比较方便(如,访问第3个元素直接查找下表尾2的元素就好),但使删除元素就会特别麻烦(比如删除第一个元素就会导致剩下的元素全部前移一位,时间复杂度尾n)。
链表是将一系列散点连成一条线存储数据,删除某点的时候直接删除当前点,将此点前一个点连接到后一个点即可。
双端队列实现:
节点类型
struct node{
int key;
node *prev,*next;
};
知识兔初始化
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;
}
知识兔搜索元素
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,命令过程中元素不超过106
代码:
#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;
}
知识兔