单链表
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n;
int h[N],e[N],ne[N],head,indx;
int x;
void init() {
head=-1;
//最开始的时候链表头节点要指向-1,为的是在后面进行不断操作后仍然可以知道链表是在什么时候结束的
indx=0;
}
//将x插入到头节点之后
void int_to_head(int x) {
e[indx]=x;
ne[indx]=head;//head指向空节点(或者另外一个节点),现在我将他所指向改为插入元素指向
head=indx;//头节点指向这个节点
indx++;
}
//将x插入到下标为k的点的后面
void add(int k,int x) {
e[indx]=x;//首先先赋值
ne[indx]=ne[k];//指向k所指向的值
ne[k]=indx;//改变k的指向
indx++;
}
//将下标为k后面的点删除
void remove(int k) {
ne[k]=ne[ne[k]];
}
int main() {
cin>>n;
init();
for(int i=0; i<n; i++) {
char s;
cin>>s;
if(s=='H') {
int k;
cin>>k;
int_to_head(k);
}
if(s=='D') {
int k;
cin>>k;
if(k==0) //删除头节点
head=ne[head];
else
remove(k-1);//下标从0开始,所以k-1
}
if(s=='I') {
int k;
cin>>k>>x;
add(k-1,x);
}
}
for(int i=head; i!=-1; i=ne[i]) {
cout<<e[i]<<' ';
}
return 0;
}
双链表
#include<iostream>
using namespace std;
const int N=1e5+10;
int m;
int e[N],l[N],r[N];
int idx;
void init() {
l[1]=0;
r[0]=1;
//第一个点的右边是1
//第二个点的左边是0
idx=2;//已经用掉两个点了
}
void add(int k,int x) {
//在第k个点右边插入一个x
e[idx]=x;//赋值
l[idx]=k;
r[idx]=r[k];//当先插入的指向原来k右边所指向的
l[r[k]]=idx;//原来k指向的右边,现在他左边变成idx了
r[k]=idx;//第k个指向idx
idx++;
}
void remove(int k) {
//删除第k个节点
r[l[k]]=r[k];//第k个节点左边的节点的右边的节点改为k右边的节点
l[r[k]]=l[k];//第k个节点右边的节点的左边节点改为k左边的节点
}
int main() {
ios::sync_with_stdio(false);
cin>>m;
init();
while(m--) {
string op;
cin>>op;
int k,x;
if(op=="R") {
cin>>x;
add(l[1],x);
//r[1]指向的是空节点
//在最右边插入
} else if(op=="L") {
//在最左边插入
cin>>x;
add(0,x);
} else if(op=="D") {
//将第k个插入的数删除
cin>>k;
remove(k+1);
} else if(op=="IL") {
//在k左边插入
cin>>k>>x;
add(l[k+1],x);
} else {
//在k右边插入
cin>>k>>x;
add(k+1,x);
}
}
for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';
return 0;
}