L2-002 链表去重
这题我采用的思想如下
使用yxz模板,造了2个单链表,一个存储去重的,一个存储抛弃的。
链表都采用尾插法,由于题目友好,第一个链表直接插入就行,第二个链表要采用尾插法比较合适。
使用了add,add2分别是第一个与第二个链表的插入函数,adds是输出补0的函数,delete_chainh函数是下标为j的下一个节点的函数。
步骤是这样的
先完整把一个链表1造出来。
删除多余节点,并将删除节点载入另外一个链表2
输出链表1,输出链表2
#include<iostream>
using namespace std;
int const N=1e6+10;
int head=-1,e[N],ne[N];//去重的
int head2=-1,idx2,e2[N],ne2[N];//抛弃的
bool st[N];
void add(int idx,int x,int next){
e[idx]=x,ne[idx]=next;
}
void add2(int idx,int x){
if(head2==-1){
head2=idx;
}
ne2[idx2]=idx;//让尾巴节点更新为
e2[idx]=x,ne2[idx]=-1;//插入尾巴节点
idx2=idx;//尾节点后移动
}
string adds(int i){
string s;
if(i<0)return "";
if(i<10)s="0000";
else if(i<100)s="000";
else if(i<1000)s="00";
else if(i<10000)s="0";
return s;
}
void delete_chain(int i){
ne[i]=ne[ne[i]];
}
int main(){
int n;
cin>>head>>n;
while(n--){
int idx,x,next;
cin>>idx>>x>>next;
add(idx,x,next);
}
st[abs(e[head])]=true;
for(int i=head;i!=-1;){
int nei=ne[i];
int j=e[i],next=e[nei];//next是下一次的值
if(st[abs(next)]&&nei!=-1){//如果下一次的键值是重复的
add2(nei,next);
delete_chain(i);//删除下一次的值
}
else{
st[abs(next)]=true;//说明下一次的值没有重复
i=ne[i];
}
}
for(int i=head;i!=-1;i=ne[i]){
int j=e[i];
cout<<adds(i)<<i<<" "<<j<<" "<<adds(ne[i])<<ne[i]<<endl;
}
for(int i=head2;i!=-1;i=ne2[i]){
int j=e2[i];
cout<<adds(i)<<i<<" "<<j<<" "<<adds(ne2[i])<<ne2[i]<<endl;
}
}