关于数组模拟单链表的图形化描述
head表示头节点下标
e[i] 表示节点i的值是多少
ne[i] 表示节点i的next指针是多少(节点i的下一个点的下标是什么)
idx 存储我们当前已经用到了哪个点(0,1,2…)
如上图:idx目前为2,head目前也为2;即idx=2,head=2;
目前:
e[2] = 3, e[1] = 5, e[0] = 7;
ne[2] = 1, ne[1] = 0, ne[0] = -1;
head = 2;
idx = 2;
如果一直从头节点插入元素,那么idx的值是顺序的(2,1,0)
如果从某个位置插入元素,那么idx的值是无顺序的(2,1,3,0),比如下图
目前:
e[2] = 3, e[1] = 5, e[3] = 8;
ne[2] = 1, ne[1] = 3, ne[3] = 0, ne[0] = -1
head = 2;
idx = 3;
代码如下
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int e[N], ne[N];
int idx, head;
// 初始化
void init() {
head = -1;
idx = 0;
}
// 插入头节点
void add_head(int a) {
e[idx] = a;
ne[idx] = head;
head = idx++;
}
// 指定位置插入节点
void add(int i, int a) {
e[idx] = a;
ne[idx] = ne[i];
ne[i] = idx++;
}
// 删除指定位置元素
void remove(int i) {
ne[i] = ne[ne[i]];
}
int main ()
{
init();
int m;
cin>>m;
while (m-- > 0) {
string op;
int k, x;
cin>>op;
if (op == "D") {
cin>>k;
if(!k) head=ne[head];
else remove(k - 1);
} else if (op == "H") {
cin>>x;
add_head(x);
} else if (op == "I") {
cin>>k>>x;
add(k - 1, x);
}
}
for (int i = head; i != -1; i = ne[i]) cout<<e[i]<<" ";
return 0;
}