2 - 链表

单链表

只具有一种指向方向的链表

常见操作为插入节点与删除节点

模板题为acwing的826题

用一个结构体数组模拟链表,cnt指向当前最后一个插入的数字

H表示往链表头插入一个数x

D表示删除第k个输入的后一个数,如果k为0则删除链表头

I表示往第k个输入后插入一个数x

#include<bits/stdc++.h>
using namespace std;
struct List{
    int val,next;//next如果为0表示到达链表尾部
}ar[100050];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int M,i,x,k,head=0,cnt=0;//head表示当前链表头的位置,cnt表示某个输入数
    char s[2];
    cin>>M;
    for(i=1;i<=M;i++){
        cin>>s;
        if(s[0]=='H'){
            cin>>x;
            cnt++;
            ar[cnt].val=x;
            ar[cnt].next=head;
            head=cnt;//先让其指向旧链表头后再更新链表头
        }
        else if(s[0]=='D'){
            cin>>k;
            if(k)
                ar[k].next=ar[ar[k].next].next;//直接指向下一个数的下一个数
            else
                head=ar[head].next;//更改链表头为链表内第二个数
        }
        else if(s[0]=='I'){
            cin>>k>>x;
            cnt++;
            ar[cnt].val=x;
            ar[cnt].next=ar[k].next;//先复制第k个数的指向
            ar[k].next=cnt;//再让第k个数指向自己
        }
    }
    if(head)
        cout<<ar[head].val;
    while(ar[head].next){
        head=ar[head].next;
        cout<<' '<<ar[head].val;
    }
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/stelayuri/p/12339865.html