在算法竞赛和工程实践中,链表往往用于处理频繁的插入与删除操作。相比于顺序表,链表不需要移动大量元素,但直接操作指针容易出错且难以调试。这里分享两个经典案例,展示如何用数组模拟链表来高效解决问题。
队列安排
题目要求模拟一个队伍中学生的插入和出队过程。由于涉及在任意位置前后插入,双向链表是天然的选择。为了节省内存分配开销并提高访问速度,我们常用静态链表的方式,即使用 pre 和 ne 数组分别记录每个节点的前驱和后继索引。
核心逻辑在于维护一个头结点(通常设为 0),通过它遍历整个链表。插入时,需要更新相邻节点的指针指向新节点;删除时,只需跳过该节点即可。
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int pre[N];
int ne[N];
int mp[N]; // mp[i] 表示 i 这个同学是否已经出队
int main(){
int n;
cin >> n;
ne[0]=1;
mp[1]=1;
for(int i =2; i <= n; i++){
int k, p;
cin >> k >> p;
if(p ==0){ // 插在 k 前面
pre[i]= pre[k];
ne[i]= k;
ne[pre[k]]= i;
pre[k]= i;
mp[i]=1;
}
else if(p ==1){ // 插在 k 后面
pre[i]= k;
ne[i]= ne[k];
pre[ne[k]]= i;
ne[k]= i;
mp[i]=1;
}
}
int m;
cin >> m;
for(int i =1; i <= m; i++){
int x;
cin >> x;
(mp[x]==)
;
ne[pre[x]]= ne[x];
pre[ne[x]]= pre[x];
mp[x]=;
}
( i = ne[]; i; i = ne[i])
cout << i << ;
;
}


