这题如果用数组模拟链表,一定要用双链表!!!
先看看用单链表会出现什么问题
下面展示一些 内联代码片
。
单链表的删除
//删除第k点的下一个点
void remove(int k){
ne[k] =ne [ne[k]];
}
比如链表是:
2->1->3->3->5->7
0 1 2 3 4 5(节点)
如果删除元素3
先remove(1);
此时会出现 1号节点指向3号节点,2号节点指向3号节点
下一步 remove(2)
此时会出现 2号节点指向4号节点,3号节点指向4号节点
那么总体结果就是 0号节点->1号节点->3号节点->4号节点....
这样子3号节点的3就没有删除。
原因:单链表方向只有一个,会出现多指。
所以要用双链表
下面展示一些 内联代码片
。
AC的双链表
#include<iostream>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int N =200010;
int e[N],l[N],r[N],idx;
//初始化
void inti(){
r[0]= 1;
l[1]= 0;
idx=2;
}
//在下标为 k 的节点后面 插入一个数 x,
void add(int k,int x){
e[idx] = x;//经典的先赋值
r[idx] = r[k];//连右方向
l[idx] = k;//连左方向
l[r[k]] = idx;//先搞这个不然r[k]会先变
r[k] = idx;
idx++;
}
//删除下标为 k 的节点 后一个数
void remove(int k){
r[l[k]] = r[k];
l[r[k]] = l[k];
}
int main(){
cin.tie(0);
ios::sync_with_stdio(0);
inti();
int n,x;
cin>>n;
for(int i=0;i<n;i++ ){
cin>>x;
add(l[1],x);
}
int w;
cin>>w;
for(int i = r[0]; i != 1; i = r[i]){
if(e[i]!=w) continue;
else remove(i);
}
for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';
}
下次再见了。