您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页L2-002 链表去重

L2-002 链表去重

来源:化拓教育网

测试用例过了,只有一个节点的也过了,多重复测试用例也没问题,剩下纯纯黑盒,完全无从下手。。。你清高,我没时间给你耗了😡(╯▔皿▔)╯

//多重复测试
00100 3
00100 2 00300
00300 2 00400
00400 2 -1
//结果
00100 2 -1
00300 2 00400
00400 2 -1

//静态链表加对应set去重
#include<bits/stdc++.h>
using namespace std;
//const int N = 1e5+5;
typedef struct Node{
    int num;
    int next;
}ListNode;
// ListNode node1[N];
// ListNode node2[N];
map<int,ListNode> mp1;
map<int,ListNode> mp2;
set<int> same;
int main(){
    int ad,n;
    cin>>ad>>n;
    int f = ad;
    for(int i = 0;i<n;i++){
        int x,y,z;
        cin>>x>>y>>z;
        ListNode e;
        e.num = y;
        e.next = z;
        mp1[x] = e;
        //由于其输入不按顺序故没法直接再此去重(而在后面按地址进行遍历时才进行去重)
    }
    int fd = -1,flag = 0;//记录删除链表的第一个节点的地址
    int pread = -1;
    int delpre = -1;
    do{
        if(same.find(abs(mp1[ad].num))==same.end()){//找到最后都没有找到故在按地址顺序遍历下一个
            same.insert(abs(mp1[ad].num));
            pread = ad;//记录前一个的地址进而有利于删除
            // printf("集合:");
            // for(auto it = same.begin();it!=same.end();it++){
            //     printf("%d ",*it);
            // }
            // printf("\n");
        }
        //没有找到就要进行去重并对其链表进行维护
        else{
            if(flag==0){
                fd = ad;
                flag = 1;
                mp2[ad].num = mp1[ad].num;
                mp2[ad].next = -1;
                delpre = ad;
                //删除对应重复节点(实际上没有删除而只是按地址遍历时其不出现了而已)
                mp1[pread].next = mp1[ad].next;//***
            }else{
                mp2[ad].num = mp1[ad].num;
                mp2[ad].next = -1;
                mp2[delpre].next = ad;
                //删除对应重复节点(实际上没有删除而只是按地址遍历时其不出现了而已)
                mp1[pread].next = mp1[ad].next;//***
            }
            mp2[ad].num = mp1[ad].num;
            mp2[ad].next = -1;
            //删除对应重复节点(实际上没有删除而只是按地址遍历时其不出现了而已)
            mp1[pread].next = mp1[ad].next;
        }
        if(mp1[ad].next!=-1){
            //pread = ad;//记录前一个的地址进而有利于删除
            ad = mp1[ad].next;
        }
        else{
            break;
        }
    }while(1);
    while(f!=-1){
        if(mp1[f].next==-1){
            printf("%05d %d %d\n",f,mp1[f].num,mp1[f].next);
        }
        else{
            printf("%05d %d %05d\n",f,mp1[f].num,mp1[f].next);
        }
        //cout<<f<<" "<<mp1[f].num<<" "<<mp1[f].next<<endl;
        f = mp1[f].next;
    }
    while(fd!=-1){
        if(mp2[fd].next==-1){
            printf("%05d %d %d\n",fd,mp2[fd].num,mp2[fd].next);
        }
        else{
            printf("%05d %d %05d\n",fd,mp2[fd].num,mp2[fd].next);
        }
        //cout<<fd<<" "<<mp2[fd].num<<" "<<mp2[fd].next<<endl;
        fd = mp2[fd].next;
    }
    // ad = f;
    // do{
    //     //cout<<ad<<" "<<mp1[ad].num<<" "<<mp1[ad].next<<endl;
    //     if(mp1[ad].next==-1){
    //         printf("%05d %d %d\n",ad,mp1[ad].num,mp1[ad].next);
    //     }
    //     else{
    //         printf("%05d %d %05d\n",ad,mp1[ad].num,mp1[ad].next);
    //     }
    //     if(mp1[ad].next!=-1){
    //         ad = mp1[ad].next;
    //     }else{
    //         break;
    //     }
    // }while(1);
    // ad = fd;
    // do{
    //     //cout<<ad<<" "<<mp1[ad].num<<" "<<mp1[ad].next<<endl;
    //     if(mp2[ad].next==-1){
    //         printf("%05d %d %d\n",ad,mp2[ad].num,mp2[ad].next);
    //     }
    //     else{
    //         printf("%05d %d %05d\n",ad,mp2[ad].num,mp2[ad].next);
    //     }
    //     if(mp2[ad].next!=-1){
    //         ad = mp2[ad].next;
    //     }else{
    //         break;
    //     }
    // }while(1);
    return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务