用数组模拟链表寻找特定节点完成题目中的操作。
寻找特定节点的一种朴素方法是遍历整个链表,当e[curr] == x时返回x值所对应的索引,在本题中使用这种方式在数据量大的时候会超时,因此本题不会得到满分。
head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点。
注意:链表节点的删除通常指跳过某个特定节点。
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100000;
int head,idx,e[N],ne[N];
void init()//初始化
{
head=-1;
idx=0;
}
void in_head(int x)//头节点插入特定值x
{
e[idx]=x;
ne[idx]=head;
head=idx++;
}
void insert(int k,int y)//在索引为k的节点的后面插入值为y的节点
{
e[idx]=y;
ne[idx]=ne[k];
ne[k]=idx++;
}
void rem(int k)//删除索引为k的节点之后的节点
{
ne[k]=ne[ne[k]];
}
int findNode(int x) {
int curr = head; // 从头节点开始遍历
while (curr != -1) { // 遍历链表直到末尾
if (e[curr] == x) {
return curr; // 找到匹配的节点,返回其索引
}
curr = ne[curr]; // 移动到下一个节点
}
return -1; // 未找到匹配的节点,返回-1
}
int main()
{
init();
in_head(1);
int q;
scanf("%d",&q);
while(q--)
{
int s,x,y;
scanf("%d %d",&s,&x);
int k=findNode(x);
if(s==1)
{
scanf("%d",&y);
insert(k,y);
}
else if(s==2)
{
if(ne[k]==-1) printf("0\n");
else printf("%d\n",e[ne[k]]);
}
else
{
rem(k);
}
}
return 0;
}
本文仅是个人做题笔记, 如有侵权行为,请联系删除。