链表与邻接表:
平时笔试不采用结构体加指针写链表,因为new Node();非常慢,通常面试会用到。
这里主要使用数组来模拟链表(数组模拟链表也被称为静态链表):
1.单链表
邻接表:存储树和图
e[N]是值;ne[N]是next指针。
#include <iostream>
using namespace std;
const int N=100010;
//head表示头结点的下标
//e[i]表示结点i的值
//ne[i]表示结点i的next指针是多少
//idx存储当前已经用到了哪个点
int head, e[N], ne[N], idx;
void init()
{
head = -1;
idx = 0;
}
//将x插入到head结点
void add_to_head(int x)
{
e[idx] = x;
ne[idx] = head;
head = idx;
idx++;
}
//将x插入到下标是k的点的后面
void add(int k,int x)
{
ne[idx]=ne[k];
e[idx] = x;
ne[k] = idx;
idx++;
}
//将下标是k的后面的点删掉
void delete(int k)
{
ne[k] = ne[ne[k]];
}
int main()
{
return 0;
}
#include <iostream>
using namespace std;
const int N= 100010;
int m,x,head,idx;
int e[N],ne[N];
void init()
{
head = -1;
idx = 0;
}
//头结点插入
void head_to_add(int x)
{
e[idx] = x;
ne[idx] = head;
head = idx;
idx++;
}
//第k个位置插入
void add(int k, int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx++;
}
//第k个位置的下一个删除
void delete_k(int k)
{
ne[k] = ne[ne[k]];
}
int main()
{
cin>>m;
char op;
int k,x;
init();
while(m--)
{
cin>>op;
if(op == 'H')
{
cin>>x;
head_to_add(x);
}
else if(op == 'D')
{
cin>>k;
//特判一下删除头结点
if(!k) head = ne[head];
delete_k(k-1);
}
else
{
cin>>k>>x;
add(k-1,x);
}
}
for(int i=head;i!=-1;i = ne[i]) cout<<e[i]<<' ';
return 0;
}
2.双链表
#include <iostream>
using namespace std;
const int N = 100010;
int m;
int e[N],l[N],r[N], idx;
//初始化
void init()
{
r[0] = 1;
l[1] = 0;
idx = 0;
}
//在第k的点的右边插入x
void add(int k, int x)
{
e[idx] = x;
l[idx] = k;
r[idx] = r[k];
l[r[k]] = idx;
r[k] = idx;
}
//删除第k个点
void remove(int k)
{
r[l[k]] = r[k];
l[r[k]] = l[k];
}