int head;
head 是 头结点的下一个节点int idx;
idx 是 当前节点的下标int e[N];
e[N] 是 节点i的值int ne[N];
ne[N] 是 节点i的next指针,也就是指向下一个节点
note:
- 注意 这道题说:第 k 个插入的数
是指 下标为 k-1 的数
- head = -1表示把整个链表清空,删除头结点应该是将第一个节点跳过去:head = ne[head]。
这道题样例过程
删除一个点后面的数 是指 删除后面的单个节点,而不是删除后面所有的
我之前理解错了,现在更正
C++ 代码
#include <iostream>
using namespace std;
const int N = 100010;
int head; // head 是 头结点的下一个节点
int idx; // idx 是 当前节点的下标
int e[N]; // e[N] 是 节点i的值
int ne[N]; // ne[N] 是 节点i的next指针,也就是指向下一个节点
void init()
{
head = -1;
idx = 0;
}
// 将x插到头结点的位置
void add_to_head(int x)
{
e[idx] = x;
ne[idx] = head;
head = idx;
idx ++ ;
}
// 将x插到下标是k的点后面
void add(int k, int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx ++ ;
}
// 将下标是k的点后面的点删掉
void remove(int k)
{
ne[k] = ne[ne[k]];
}
int main()
{
int n;
cin >> n;
init();
int k, x;
char op;
while(n -- )
{
cin >> op;
if (op == 'H')
{
cin >> x;
add_to_head(x);
}
else if (op == 'D')
{
cin >> k;
if (!k) head = ne[head]; // head = -1表示把整个链表清空,删除头结点应该是将第一个节点跳过去:head = ne[head]。
remove(k - 1); // 注意这里的是 k - 1。第 k 个插入的数是指下标为 k-1 的数
}
else
{
cin >> k >> x;
add(k - 1, x); // 这里也是 k - 1
}
}
for (int i = head; i != -1; i = ne[i])
{
cout << e[i] << ' ';
}
return 0;
}
int head;
head 是 头结点的下一个节点 (我觉得y总上课讲的时候写的有点小问题)
这样就就能解释得了 将x插到头结点的位置ne[idx] = head;
而不是ne[idx] = ne[head]
head不是头结点的下一个节点。head的值就是头节点的下标