单链表 AcWing 826. 单链表
原题链接
算法标签
链表
思路
由于C++new 操作创建链表耗时, 因此采用数组模拟链表。
模拟过程
详细过程见代码
代码
#include<bits/stdc++.h>
#define int long long
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>b;--i)
using namespace std;
const int N = 100005;
int e[N], ne[N], head=-1, idx=0;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar(x%10^48);
}
void add(int x){
e[idx]=x, ne[idx]=head, head=idx++;
}
void add_k(int k, int x){
// 将当前元素值插入
// e[idx]=x;
// 将当前元素next指针,指向前一元素next指针
// ne[idx]=ne[k];
// 前一元素next指针指向当前元素
// ne[k]=idx;
// 指针后移,为下一次插入元素做准备
// idx++;
e[idx]=x, ne[idx]=ne[k], ne[k]=idx++;
}
void remove(int k){
//前一元素next指针指向前一元素next指针的next指针,
ne[k]=ne[ne[k]];
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int m=read();
while(m--){
char op;
scanf("%c", &op);
if(op=='H'){
int x=read();
add(x);
}else if(op=='D'){
int k=read();
if(k){
remove(k-1);
}else{
head=ne[head];
}
}else{
int k=read(), x=read();
add_k(k-1, x);
}
}
for(int i=head; i!=-1; i=ne[i]){
printf("%lld ", e[i]);
}
return 0;
}
模板
// 表示在第 k 个插入的数后面插入一个数 x(此操作中 k 均大于 0)。
void add_k(int k, int x){
// 将当前元素值插入
// e[idx]=x;
// 将当前元素next指针,指向前一元素next指针
// ne[idx]=ne[k];
// 前一元素next指针指向当前元素
// ne[k]=idx;
// 指针后移,为下一次插入元素做准备
// idx++;
e[idx]=x, ne[idx]=ne[k], ne[k]=idx++;
}
// 表示删除第 k 个插入的数后面的数(当 k 为 0 时,表示删除头结点)。
void remove(int k){
//前一元素next指针指向前一元素next指针的next指针,
ne[k]=ne[ne[k]];
}
// 表示向链表头插入一个数 x。
void add(int x){
e[idx]=x, ne[idx]=head, head=idx++;
}
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈