我的代码
单链表
#include<iostream>
using namespace std;
const int M=100010;
// head 表示头结点的下标
// e[i] 表示节点i的值
// ne[i] 表示节点i的next指针是多少
// idx 存储当前已经用到了哪个点
int head,e[M],ne[M],idx;
void init()
{
head=-1;
idx=0;
}
void add_to_head(int x)
{
e[idx]=x;ne[idx]=head;head=idx++;
}
void InsertNode(int k,int x)
{
e[idx]=x;ne[idx]=ne[k];ne[k]=idx++;
}
void DeleteNode(int k)
{
ne[k]=ne[ne[k]];
}
int main()
{
int m;
cin>>m;
init();
while(m--)
{
char c;
int k,x;
cin>>c;
switch(c)
{
case 'H':
cin>>x;
add_to_head(x);
break;
case 'D':
cin>>k;
if(!k)head=ne[head];
else DeleteNode(k-1);
break;
case 'I':
cin>>k>>x;
InsertNode(k-1,x);
break;
default:break;
}
}
for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
cout << endl;
return 0;
}
双链表
#include<iostream>
using namespace std;
const int M=100005;
int e[M],l[M],r[M],idx;
void InsertNode(int a,int x)
{//在节点a的右边插入一个数
e[idx]=x;
l[idx]=a,r[idx]=r[a];
l[r[a]]=idx,r[a]=idx++;
}
void DeleteNode(int a)
{//将第a个数删除
r[l[a]]=r[a];
l[r[a]]=l[a];
}
void PrintList()
{
for(int i=r[0];i!=1;i=r[i])cout<<e[i]<<" ";
cout<<endl;
}
int main()
{
std::ios::sync_with_stdio(false);
int m;
cin>>m;
//0是左端点1是右端点
r[0]=1,l[1]=0;
idx=2;
while(m--)
{
string op;
int k,x;
cin>>op;
if(op=="L")
{
cin>>x;
InsertNode(0,x);
}
else if(op=="R")
{
cin>>x;
InsertNode(l[1],x);
}
else if(op=="D")
{
cin>>k;
DeleteNode(k+1);
}
else if(op=="IR")
{
cin>>k>>x;
InsertNode(k+1,x);
}
else
{
cin>>k>>x;
InsertNode(l[k+1],x);
}
}
PrintList();
return 0;
}