单链表
#include<iostream>
using namespace std;
const int N = 100010;
//head表示头节点的下标
//e[i]表示节点i的值
//ne[i]表示节点i的next指针是多少
//idx储存当前用到哪个点
int head,e[N],ne[N],idx;
int x,k;
char op[2];
//初始化
void init(){
head = -1;
idx = 0;
}
//将x插到头节点
void add_to_head(int x ){
e[idx] = x;
ne[idx] = head;
head = idx;
idx ++;
}
//将x插到下标是k的点的后面
void add(int k,int x){
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx ++ ;
}
//将下标是k的点后面的点删除
void remove(int k){
ne[k] = ne[ne[k]];
}
int main(){
int m;
cin >> m;
init();
while(m -- ){
cin >> op;
if(*op == 'H'){
cin >> x;
add_to_head(x);
}
else if(*op == 'D'){
cin >> k;
if(!k) head = ne[head];
else remove(k - 1);
}
else{
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 = 100010;
int e[N],l[N],r[N],idx;
string op;
//初始化0是head节点,1是tail节点
void init(){
r[0] = 1;
l[1] = 0;
idx = 2;
}
//在节点k的右边插入一个数x
void add(int k,int x){
e[idx] = x;
l[idx] = k;
r[idx] = r[k];
l[r[k]] = idx;
r[k] = idx;
idx ++;
}
//删除节点k
void remove(int k){
l[r[k]] = l[k];
r[l[k]] = r[k];
}
int main(){
int m;
cin >> m;
int k,x;
init();
while(m -- ){
cin >> op;
if(op == "L"){
cin >> x;
add(0,x);
}
else if(op == "R"){
cin >> x;
add(l[1],x);
}
else if(op == "D"){
cin >> k;
remove(k + 1);
}
else if(op == "IL"){
cin >> k >> x;
add(l[k + 1],x);
}
else {
cin >> k >> x;
add(k + 1,x);
}
}
for (int i = r[0]; i != 1; i = r[i]){
cout << e[i] << " ";
}
return 0;
}