链表一般不用结构体创建(new的使用很慢)
而是用邻接表进行表示
两个数组分别e[]和ne[]分别记录节点的值和下一个节点的编号
head记录头结点指向的位置,idx表示当前可以使用的节点
用数组模拟链表时,删除链表无法释放内存,但是运行速度快。
双链表则用e[]和l[]和r[]记录;
可以将单链表的head,双链表的head和tail,在0和0,1的位置记录。
做题时最好画图,以防忘记更改部分连接。
例题 AcWing 827. 双链表
#include<iostream>
using namespace std;
const int N=100010;
int e[N],l[N],r[N];
int idx=2;
void Init()
{
r[0]=1;
l[1]=0;
}
void InsertHead(int x)
{
e[idx] = x;
r[idx] = r[0];
l[idx] = 0;
l[r[0]] = idx;
r[0] = idx;
idx++;
}
void InsertTail(int x)
{
e[idx] = x;
l[idx] = l[1];
r[idx] = 1;
r[l[1]] = idx;
l[1] = idx;
idx++;
}
void Delete(int k)
{
r[l[k]]=r[k];
l[r[k]]=l[k];
}
void Insert(char d,int k,int x)
{
if(d=='L')
{
e[idx]=x;
int fore=l[k];
int back=k;
l[idx]=fore;
r[fore]=idx;
r[idx]=back;
l[back]=idx;
idx++;
}
if(d=='R')
{
e[idx]=x;
int fore=k;
int back=r[k];
l[idx]=fore;
r[fore]=idx;
r[idx]=back;
l[back]=idx;
idx++;
}
}
int main()
{
Init();
int M;
cin>>M;
while (M -- )
{
char op;
cin>>op;
if(op=='L')
{
int x;
cin>>x;
InsertHead(x);
}
if(op=='R')
{
int x;
cin>>x;
InsertTail(x);
}
if(op=='D')
{
int k;
cin>>k;
Delete(k+1);
}
if(op=='I')
{
char d;
cin>>d;
int k,x;
cin>>k>>x;
Insert(d,k+1,x);
}
}
int index=r[0];
while(index!=1)
{
cout<<e[index]<<' ';
index=r[index];
}
return 0;
}