对于链表我想大家应该都不陌生,但是再算法里面,一般以静态链表为准(数组模拟链表)。主要是因为快。
这里总结了基本算法用到的一些模板,不出意外应该就这些,再看代码的时候希望画图理解qwq
// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点
int head, e[N], ne[N], idx;
//初始化
int intx(){
head = -1;
idx = 0;
}
// 在链表头插入一个数
int add_head(int x){
e[idx] = x;
ne[idx] = head;
head = idx++;
}
//将头结点删除,保证头结点存在
int remove(){
head = ne[head];
}
//在链表中插入一个数
int add(int k,int x){
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx++;
}
//再链表中删除一个数
int remove_d(int k){
ne[k] = ne[ne[k]]
}
直接根据题目来看吧。
https://www.acwing.com/problem/content/828/
题目要求就是根据不同的操作来模拟链表,最后遍历输出。
#include<bits/stdc++.h>
using namespace std;
const int N =1e5+9;
int e[N],ne[N],head,idx,n,x,k;
//head就是头结点下标
//idx类似于指针
//e[]表示结点的值
//nep[]表示结点的next值
//初始化
void intx(){
head = -1;
idx = 0;
}
//头插入
int add(int x){
e[idx] = x;
ne[idx] = head;
head = idx++;
}
//中间插入
int int_add(int k,int x){
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx++;
}
//删除
int delet(int k){
ne[k] = ne[ne[k]];
}
int main(){
cin >> n;
intx();
while(n--){
char op;
cin >> op;
if(op=='H'){
scanf("%d",&x);
add(x);
}
if(op=='I'){
scanf("%d%d",&k,&x);
int_add(k-1,x);
}
if(op=='D'){
scanf("%d",&k);
if(k==0){
head = ne[head];
}
delet(k-1);
}
}
for(int i=head;i!=-1;i=ne[i]) printf("%d ",e[i]);
printf("\n");
}