数组模拟单链表

https://www.acwing.com/problem/content/828/
链表的实现有许多种,可以使用struct加指针的方式实现,
但是这样的方式会使用new运算符,new运行的十分的慢
动态链表因为new的原因极其慢
而数组模拟的静态链表极其快
在面试时的数据量一般非常大,这时候new就会拖我们的后腿,故采用数组模拟链表,主要使用邻接表表示,邻接表一般用于存储图和树
在实现双链表时一般是用于优化某些问题的
使用e[N]表示val,ne[N]表示下个结点,使用下标索引,空结点为-1,

初始状态:

插入头结点:

一般插入:

删除:


对于第1个点,下标为0,此后idx++,那么第2个点下标为1,那么有第k个点,下标为k-1

#include<iostream>
#include<cstring>

using namespace std;

const int N = 100010;

int head,idx;//头指针和数组结点指针,idx即当前已经用到了第哪个点
int e[N],ne[N];
int k,num,m;
void init()
{
	head = -1;//表示不存在结点
	idx=0;//从0号点开始分配
}

void add_to_head(int x)
{
	e[idx]=x;//将idx点分配给新点
	ne[idx]=head;//设置新点的指针
	head=idx;//设置新点为头结点,头指针指向新点
	idx++;//从下一个点开始分配
}

void add(int k,int x)//从1开始数,在第k个点后面加入新点,k的idx为k-1
{
	e[idx]=x;//将idx分配给新点
	ne[idx]=ne[k];//设置新点指针
	ne[k]=idx;//设置第k个点的指针,指向新点
	idx++;//从下一个点开始分配
}


void remove(int k)//从1开始数,删除第k个点,k的idx为k-1
{
	ne[k]=ne[ne[k]];//设置第k个点指向它原来指向的点的指针指向的地方
	//删除点后idx不用变,被删除的跳过的点可以当它不存在
}

int main()
{
	cin >> m;
	
	init();
	
	while(m--)
	{
		char cmd;
		cin >> cmd;
		
		if(cmd == 'H')
		{
			cin >> num;
			add_to_head(num);  
		}
		else if(cmd=='I')
		{
			cin >> k >> num;
			add(k-1,num);
		}
		else
		{
			cin >> k;
			if(k==0)//特判头结点
			{
				head=ne[head];
			}
			remove(k-1);
		}
	}
	
	for(int i=head;i != -1;i=ne[i]) cout << e[i] << ' ';
	cout << endl;
	return 0;
}

 

posted @ 2023-03-20 22:16  风乐  阅读(24)  评论(0)    收藏  举报