L2-002 链表去重

#include <bits/stdc++.h>

using namespace std;

bool st[100010];

int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    
    string init;
    int n;
    cin >> init >> n;

    map<string, pair<int, string>> link;
    vector<tuple<string, int, string>> all;
    for (int i = 0; i < n; i++) {
        string address, ne;
        int val;
        cin >> address >> val >> ne;
        link[address] = {val, ne};
    } 
    string curadd = init;
    while (true) {
        all.push_back({curadd, link[curadd].first, link[curadd].second});
        if (link[curadd].second == "-1") break;
        curadd = link[curadd].second;
    }
    
    vector<tuple<string, int, string>> del; 
    vector<tuple<string, int, string>> after; 
    for (int i = 0; i < all.size(); i++) { //删除重复结点
        //cout << get<0>(all[i]) << " " << get<1>(all[i]) << " " << get<2>(all[i]) << "\n";
        string add = get<0>(all[i]), ne = get<2>(all[i]);
        int val = get<1>(all[i]);
        
        if (st[abs(val)]) { //如果已经出现过
            del.push_back({add, val, ne});
        } else {
            st[abs(val)] = true;
            after.push_back({add, val, ne});
        }
    }

    for (int i = 0; i < after.size(); i++) {
        string add = get<0>(after[i]), ne = get<2>(after[i]);
        int val = get<1>(after[i]);
        if (i == after.size() - 1) { //当前是最后一个结点 结尾为-1
            after[i] = {add, val, "-1"};
        } else {
            if (ne != get<0>(after[i + 1])) {
                after[i] = {add, val, get<0>(after[i + 1])};
            }
        }
    }

    for (int i = 0; i < del.size(); i++) {
        string add = get<0>(del[i]), ne = get<2>(del[i]);
        int val = get<1>(del[i]);
        if (i == del.size() - 1) { //当前是最后一个结点 结尾为-1
            del[i] = {add, val, "-1"};
        } else {
            if (ne != get<0>(del[i + 1])) {
                del[i] = {add, val, get<0>(del[i + 1])};
            }
        }
    }

    for (int i = 0; i < after.size(); i++) {
        string add = get<0>(after[i]), ne = get<2>(after[i]);
        int val = get<1>(after[i]);
        cout << add << " " << val << " " << ne << "\n";
    }

    for (int i = 0; i < del.size(); i++) {
        string add = get<0>(del[i]), ne = get<2>(del[i]);
        int val = get<1>(del[i]);
        cout << add << " " << val << " " << ne << "\n"[i == del.size() - 1];
    }


    return 0;
}
posted @   Xxaj5  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2020-03-14 多数元素 (3.12 leetcode每日打卡)
2020-03-14 (Good topic)回文数(3.13 leetcode每日打卡)
2020-03-14 (Good topic)贪心+二分查找:最长上升子序列(3.14 leetcode每日打卡)
2020-03-14 递归与分治思想:八皇后问题 (在此用递归) (回溯算法的典型题)
2020-03-14 递归与分治思想:汉诺塔(递归 && 分治思想)
2020-03-14 递归与分治思想:治思想 && 折半查找法(迭代 && 递归)
2020-03-14 递归与分治思想:n的阶乘 && 逆序任意长度字符串(递归)
点击右上角即可分享
微信分享提示