題目:鏈表去重
思路:
(1)直接用數組模擬鏈表即可;
(2)利用一個標記數組,將加入去重鏈表的值進行絕對值標記。
代碼:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
const int maxn = 100005;
int visit[maxn];
struct link{
int key;//值
int next;//下一結點
}a[maxn];
link ans[maxn],del[maxn];
int oper(int start){
int recA=maxn-3,recD=maxn-3,recS=maxn-3,flag = 1;
while(1){
if(!visit[abs(a[start].key)]){//如果當前鏈表中沒有此值,進行鏈接
visit[abs(a[start].key)] = 1;//標記鏈表存在此值了
ans[recA].next = start;//將上一結點的下一結點存爲當前結點,意思是將當前結點鏈到上一結點上
ans[start].key = a[start].key;//將當前結點的值保存
ans[start].next = -1;//當前結點的下一結點置爲尾結點-1
recA = start;//記錄當前結點
}else{//出現重複元素
if(flag) {recS = start;flag = 0;}//記錄首結點
//記錄刪除鏈表的鏈接同上
del[recD].next = start;
del[start].key = a[start].key;
del[start].next = -1;
recD = start;
}
if(a[start].next == -1) break;//當達到尾結點時結束
start = a[start].next;//下一結點
}
return recS;//返回刪除鏈表的首結點
}
void print(link p[],int start){//輸出鏈表元素
while(p[start].next != -1){
printf("%05d %d %05d\n",start,p[start].key,p[start].next);
start = p[start].next;
}
printf("%05d %d -1\n",start,p[start].key);
}
int main()
{
int n,start,add,key,nex;
while(~scanf("%d%d",&start,&n)){
memset(visit,0,sizeof(visit));
for(int i=0;i<n;i++){
scanf("%d%d%d",&add,&key,&nex);
a[add].key = key;
a[add].next = nex;
}
int ds = oper(start);
print(ans,start);
if(ds != maxn-3) print(del,ds);
}
return 0;
}