题目描述
给定N个整数,将这些整数中与M相等的删除
假定给出的整数序列为:1,3,3,0,-3,5,6,8,3,10,22,-1,3,5,11,20,100,3,9,3
应该将其放在一个链表中,链表长度为20
要删除的数是3,删除以后,链表中只剩14个元素:1 0 -3 5 6 8 10 22 -1 5 11 20 100 9
要求:必须使用链表,不允许使用数组,也不允许不删除元素直接输出
程序中必须有链表的相关操作:建立链表,删除元素,输出删除后链表中元素,释放链表
不符合要求的程序即使通过,也会算作0分
样例
20
1 3 3 0 -3 5 6 8 3 10 22 -1 3 5 11 20 100 3 9 3
3
算法
用数组模拟链表, h 表示头结点,t表示尾节点,e[N]表示编号, ne[N]表示后继节点的数组下标,idx表示当前用到的数组下表
(暴力枚举) $O(n^2)$
C++ 代码
#include <iostream>
using namespace std;
const int N = 200010;
int h = -1,t, e[N], ne[N], idx;
int n;
int target;
void add_to_head(int x){
e[idx] = x;
ne[idx] = h;
h = idx ++;
t = h;
}
void add_to_tail(int x){
e[idx] = x;
ne[t] = idx ++;
t = ne[t];
ne[t] = -1;
}
int main(){
cin >> n;
int x;
cin >> x;
add_to_head(x);
n --;
while(n --){
cin >> x;
add_to_tail(x);
}
cin >> target;
while(e[h] == target) h = ne[h];
int cur = h;
while(cur != -1 && ne[cur] != -1){
while(e[ne[cur]] == target) ne[cur] = ne[ne[cur]];
cur = ne[cur];
}
for(int i = h; i != -1; i = ne[i]) cout << e[i] << " ";
return 0;
}