一、问题描述
二、思路分析
这个问题,首先很容易想到要双重遍历,但是时间复杂度会比较高。那么我们可以考虑使用数组计数,这样就可以遍历一遍,这也算是一个比较好用的套路。
三、代码实现
3.1 第一种解法
void deleteDul(Link &link){
Link cur = link->next;
while(cur != NULL){
Link next = cur;
while(next != NULL && next->next != NULL){
if(cur->data == next->next->data || -cur->data == next->next->data){
next->next = next->next->next;
}
next = next->next;
}
cur = cur->next;
}
}
3.2 第二种解法
void deleteDul02(Link &link,int n){
Link cur = link;
int judge[n+1];
for(int i=0;i<=n;i++){
judge[i] = 0;
}
while(cur != NULL&&cur->next != NULL){
int data = cur->next->data;
if(judge[data] == 1 || judge[-data] == 1){
cur->next = cur->next->next;
}else{
if(data < 0){
data = -data;
}
judge[data] = 1;
cur=cur->next;
}
}
}