链表与邻接表(数组模拟)
链表与邻接表
链表可以采用定义结构体的方式,内部使用指针来实现,但是new Node的操作非常耗费时间,一般采用数组模拟链表的方式
单链表
单链表中最常用的是邻接表,邻接表可以用来存储树和图
单链表的一般形式:开始是一个head指针,指向空结点,每个节点中会存放这个节点的值和指向下个结点的指针。
采用数组来模拟单链表需要两个数组分别存放这两个值,一般使用 e[ ]数组来存放每个结点的值,采用 ne[ ]数组来存放指针。
双链表
双链表常常用来应用于某些问题的优化
输入样例:
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]<<' ';
}

浙公网安备 33010602011771号