GPLT L2-002. 鏈表去重【鏈表】

題目:鏈表去重

思路:

(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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章