//静态链表,只往后看,找前面必须遍历
//算法题用数组解题更快速//初始化,头节点为空
//将x插入到头节点
//将x插到结点k的后面
//将下标k的后面的点删掉
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
//静态链表,只往后看,找前面必须遍历
//算法题用数组解题更快速
const int N = 100010;
int head;//头指针位置
int e[N];//表示结点i的值是多少
int ne[N];//结点i的下一个节点
int idx;//存储当前已经用到哪个地址
//初始化,头节点为空
void init(){
head = -1;
idx = 0;
}
//将x插入到头节点
void add(int x){
e[idx] = x;
ne[idx] = head;
head = idx;//head指向idx指针
idx++;
}
//将x插到结点k的后面
void addkx(int k,int x){
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx++;
}
//将下标k的后面的点删掉
void deletek(int k){
ne[k] = ne[ne[k]];
}
例题:826. 单链表
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
//静态链表,只往后看,找前面必须遍历
//算法题用数组解题更快速
const int N = 100010;
int head;//头指针位置
int e[N];//表示结点i的值是多少
int ne[N];//结点i的下一个节点
int idx=1;//存储当前已经用到哪个地址
//初始化,头节点为空
void init(){
head = -1;
idx = 0;
}
//将x插入到头节点
void add(int x){
e[idx] = x;
ne[idx] = head;
head = idx;//head指向idx指针
idx++;
}
//将x插到结点k的后面
void addkx(int k,int x){
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx++;
}
//将下标k的后面的点删掉
void deletek(int k){
ne[k] = ne[ne[k]];
}
int main()
{
init();
int n;
scanf("%d",&n);
while(n--){
char op[2];
scanf("%s",&op);
if(op[0] == 'H'){//在头节点后面插入
int x;
scanf("%d",&x);
add(x);
}
if(op[0] == 'D'){//要特判删除头指针
int k;
scanf("%d",&k);
if(!k) head = ne[head];
else deletek(k-1);
}
if(op[0] == 'I'){
int x,k;
scanf("%d%d",&k,&x);
addkx(k-1,x);
}
}
for(int i=head;i!=-1;i=ne[i]){
printf("%d ",e[i]);
}
return 0;
}