板子:
int head,e[N],ne[N],idx,n;//head记录头结点位置,e[]记录值,ne[]记录下个节点,idx记录现在数组可用位置 void init(){//初始化 head=-1; idx=0; } void InsertHead(int x){//在头部插入 e[idx]=x, ne[idx]=head,head=idx++; } void Delete(int k){//删除第k个节点后的一个节点 if(k==0) head=ne[head]; else ne[k-1]=ne[ne[k-1]];//因为idx是从0开始所以第k个是k-1位置 } void Insert(int k,int x){//在第k个节点后面插入一个节点 e[idx]=x,ne[idx]=ne[k-1],ne[k-1]=idx++;//因为idx是从0开始所以第k个是k-1位置 }
所有代码:
#include <bits/stdc++.h> using namespace std; const int N=100005; int head,e[N],ne[N],idx,n;//head记录头结点位置,e[]记录值,ne[]记录下个节点,idx记录现在数组可用位置 char op[3]; int k,x; void init(){//初始化 head=-1; idx=0; } void InsertHead(int x){//在头部插入 e[idx]=x, ne[idx]=head,head=idx++; } void Delete(int k){//删除第k个节点后的一个节点 if(k==0) head=ne[head]; else ne[k-1]=ne[ne[k-1]];//因为idx是从0开始所以第k个是k-1位置 } void Insert(int k,int x){//在第k个节点后面插入一个节点 e[idx]=x,ne[idx]=ne[k-1],ne[k-1]=idx++;//因为idx是从0开始所以第k个是k-1位置 } int main(int argc, char** argv) { cin>>n; init(); for(int i=0;i<n;i++){ scanf("%s",op); if(op[0]=='H') scanf("%d",&x),InsertHead(x); else if(op[0]=='D') { scanf("%d",&k); Delete(k); }else{ scanf("%d%d",&k,&x); Insert(k,x); } } for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<" "; cout<<endl; return 0; }