B 3631单向链表

点击查看代码
#include<bits/stdc++.h>

using namespace std;

const int N=1000010;
int e[N],ne[N],idx,head=-1;
int pos[N];
//此题的关键是查询数值,需要根据数值来查询到一个元素的后面一个元素是什么
//那就通过遍历了,思路不难
//遍历效率太低了,最高是100000次,需要一个映射数组
void add_to_head(int x)
{
    e[idx]=x;
    ne[idx]=head;
    pos[x]=idx;
    head=idx++;
}

void init()
{
    head=-1;
    idx=0;
    memset(pos,-1,sizeof(pos));
    add_to_head(1);
}

void add(int k,int x)
{
    e[idx]=x;
    ne[idx]=ne[k];
    pos[x]=idx;
    ne[k]=idx++;
}

void remove(int k)
{
    pos[e[ne[k]]]=-1;
    ne[k]=ne[ne[k]];
    
}

//然后为了实现题目的所有操作需要根据元素值找到对应的下标
int main()
{
    init();
    int q;
    cin>>q;
    while(q--){
        int op,x,y;
        cin>>op;
        if(op==1){
            cin>>x>>y;
            add(pos[x],y);
        }else if(op==2){
            cin>>x;
            if(ne[pos[x]]==-1) printf("0\n");
            else cout<<e[ne[pos[x]]]<<endl;
        }else if(op==3){
            cin>>x;
            remove(pos[x]);
        }
    }

    return 0;
}
本题的核心就在于通过元素值找到对应的下标,用遍历的方法太低效了,真正高效的方法是利用映射数组 每给出一个值就将它的值与下标对应,通过映射数组直接访问下标
posted @ 2025-11-24 10:37  AnoSky  阅读(17)  评论(0)    收藏  举报