自学内容网 自学内容网

数据结构 单链表

#include<iostream>

using namespace std;

const int N=100010;
int head,e[N],ne[N],idx;

void init(){
    head=-1;
    idx=0;
}

void add_head(int x){
    e[idx]=x;
    ne[idx]=head;
    head=idx++;
}

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

void remove(int k){
    ne[k]=ne[ne[k]];
}

int main(){
    init();
    int m;
    scanf("%d",&m);
    
    while(m--){
        char op;
        int k,x;
        cin>>op;
        
        if(op=='H'){
            scanf("%d",&x);
            add_head(x);
        }else if(op=='D'){
            scanf("%d",&k);
            if(!k){
                head=ne[head];
            }else{
                remove(k-1);
            }
        }else{
            scanf("%d%d",&k,&x);
            add(k-1,x);
        }
    }
    
    for(int i=head;~i;i=ne[i]){
        printf("%d ",e[i]);
    }
    printf("\n");
    
    return 0;
}

把模板记住就好了。这题的 k k k 是从 1 1 1 开始的,但是我们的 i d x idx idx 是从 0 0 0 开始的, i d x idx idx 是索引下标,需要注意一下。另外删除的时候注意假设我们删除的元素是第一个插入的元素,也就是下标是 0 0 0 的元素,这个时候需要特判一下。防止数组越界。

head=idx++;
//等价于下面的
head=idx;
idx++;

这是因为 idx++ 是使用完了之后再更新。也就是使用的是更新之前的数值。可以记为 i d x idx idx + + + 的前面,所以用的是前面(之前的,未更新的)的数值。


原文地址:https://blog.csdn.net/L3102250566/article/details/145283607

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!