题目一
826. 单链表
解题思路
不使用结构体&指针链表的原因:new函数效率很低,在输入大量数据时会导致超时
故使用两个数组模拟链表在内存中的运行逻辑
代码模板
#include <iostream>
using namespace std;
const int N = 100010;
int value[N],ne[N],head=-1,index=0;
void add_to_head(int x)
{
value[index]=x;
ne[index]=head;
head=index;
index++;
}
void remove(int k)
{
ne[k]=ne[ne[k]];
}
void insert(int k,int x)
{
value[index]=x;
ne[index]=ne[k];
ne[k]=index;
index++;
}
int main()
{
int m;
cin>>m;
while(m--)
{
char M;
int k,x;
cin>>M;
if(M=='H')
{
cin>>x;
add_to_head(x);
}
else if(M=='D')
{
cin>>k;
if(k==0)head=ne[head];
remove(k-1);
}
else if(M=='I')
{
cin>>k>>x;
insert(k-1,x);
}
}
for(int i=head;~i;i=ne[i])
printf("%d ",value[i]);
return 0;
}
题目二
解题思路
使用index 0和1 作为双链表的两端点,读入参数的index初始值为2
add函数利用双链表的特性简化为传参实现不同功能
其余用数组模拟指针地址来模拟链表
注意双链表不仅要更改左值,还要更改另一个方向的值。
代码模板
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int m;
int value[N],ne[N],lst[N],index;
void init()
{
index=2;
ne[0]=1;
lst[1]=0;
}
void add(int k,int x)
{
value[index]=x;
ne[index]=ne[k];
lst[index]=k;
lst[ne[k]]=index;
ne[k]=index;
index++;
}
void remove(int k)
{
lst[ne[k]]=lst[k];
ne[lst[k]]=ne[k];
}
int main()
{
init();
scanf("%d",&m);
while(m--)
{
string t;
int k,x;
cin>>t;
if(t=="L"){
cin>>x;
add(0,x);
}
else if(t=="R"){
cin>>x;
add(lst[1],x);
}
else if(t=="D")
{
cin>>k;
remove(k+1);
}
else if(t=="IL")
{
cin>>k>>x;
add(lst[k+1],x);
}
else if(t=="IR")
{
cin>>k>>x;
add(k+1,x);
}
}
for(int i=ne[0];i!=1;i=ne[i])
printf("%d ",value[i]);
return 0;
}