链表与邻接表(数组模拟)

链表与邻接表

​ 链表可以采用定义结构体的方式,内部使用指针来实现,但是new Node的操作非常耗费时间,一般采用数组模拟链表的方式

单链表

​ 单链表中最常用的是邻接表,邻接表可以用来存储树和图

​ 单链表的一般形式:开始是一个head指针,指向空结点,每个节点中会存放这个节点的值和指向下个结点的指针。

​ 采用数组来模拟单链表需要两个数组分别存放这两个值,一般使用 e[ ]数组来存放每个结点的值,采用 ne[ ]数组来存放指针。

双链表

​ 双链表常常用来应用于某些问题的优化

image-20250509200155921

输入样例

10
H 9
I 1 1
D 1
D 0
H 6
I 3 6
I 4 5
I 4 5
I 3 4
D 6

期望输出:

6 4 6 5

代码实现:

#include<bits/stdc++.h>
using namespace std;

const int N =1e6+9;
//head用来表示头指针,idx用来表示目前用到的元素地址
int n,head = -1,idx = 0;
int e[N],ne[N];


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

void Remove(int a)
{
    ne[a]=ne[ne[a]];

}

void Add(int a)
{
    e[idx] =a;
    ne[idx]=head;
    head=idx;
    idx++;
}

//做指针问题时区分好指针和结点,例如头指针和头结点的不同
int main()
{

    cin>>n;
    while(n--)
    {
        char c;
        cin>>c;

        if(c=='H')
        {
            int a;
            cin>>a;
            Add(a);
        }
        else if (c=='D')
        {
            int a;
            cin>>a;
            if(a==0)
            {
                head = ne[head];
            }
            Remove(a-1);

        }

        else if (c=='I')
        {
            int k,a;
            cin>>k>>a;
            Insert(k-1,a);
        }

    }
    for(int i=head ;i!=-1;i=ne[i])
        cout<<e[i]<<' ';

}
posted @ 2025-05-12 18:50  小花护符  阅读(15)  评论(0)    收藏  举报