826. 单链表
学习拿数组模拟链表
单链表: 用邻接表模拟:n个链表
邻接表最主要用途:存储图 and 树
双链表:优化某些问题
这种方法是非常慢的,一般面试里不用
struct Node
{
int val;
Node * next;
};
每一个结点有两个含义:val和next指针 指向下一个结点
val用e[N]数组存储
next指针用ne[N]表示
在头节点插入
将头节点插入到 x 中
idx表示存储当前已经用到了哪个点
head表示头节点的下标,是第一个元素
void add_to_head(int x)
{
e[idx] = x;
ne[idx] = head;
head = idx;
idx++;
}
将x插入下标为k的点后面
//bingo 自己写对了!
void add(int k,int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx++;
}
将下标为k的点后面的点删掉
void remove(int k)
{
ne[k] = ne[ne[k]];
}
还有一些细节 在代码里了
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100010;
int idx; //已经存储了idx个数
int head; //head是第一个数的下标(idx)
int e[N]; //存储下标为idx的元素的值
int ne[N]; //下一个数的索引下标
void Init()
{
head = -1;
idx = 0;
}
//将x插入到头节点
void add_to_head(int x)
{
e[idx] = x;
ne[idx] = head;
head = idx;
idx++;
}
//在下标为k的数的后面插入x
void add(int k,int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx++;
}
//删除下标为k的数后面的数
void remove(int k)
{
ne[k] = ne[ne[k]];
}
int main()
{
Init(); //初始化
int n;
cin>>n;
while(n--)
{
char c;
int k,x;
cin>>c;
if(c == 'H')
{
cin>>x;
add_to_head(x);
}
else if(c == 'D')
{
cin>>k;
if(k==0)
{
head = ne[head];
}
remove(k - 1); //第 k个点的下标是k-1
}
else if(c == 'I')
{
cin>>k>>x;
add(k - 1,x); //第 k个点的下标是k-1
}
}
for(int i=head;i!=-1;i=ne[i])
printf("%d ",e[i]);
}