Skip to content

L2-002 链表去重

Statement

Metadata

  • 作者: 陈越
  • 单位: 浙江大学
  • 代码长度限制: 16 KB
  • 时间限制: 400 ms
  • 内存限制: 64 MB

给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。

输入格式

输入在第一行给出 L 的第一个结点的地址和一个正整数 N\le 10^5,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。

随后 N 行,每行按以下格式描述一个结点:

地址 键值 下一个结点

其中地址是该结点的地址,键值是绝对值不超过10^4的整数,下一个结点是下个结点的地址。

输出格式

首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。

输入样例

00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854

输出样例

00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

Solution

#include <ctype.h>
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iomanip>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

#define CLR(a) memset(a, 0, sizeof(a))
#define pb push_back

using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss;

const double PI = 3.14159265358979323846264338327;
const double E = exp(1);
const double eps = 1e-6;

const int INF = 0x3f3f3f3f;
const int maxn = 1e2 + 5;
const int MOD = 1e9 + 7;

struct Node {
    int add;
    int value;
    int next;
} temp;

map<int, Node> m;
map<int, int> vis;

vector<Node> v[2];

int ini, n;

void dfs(int add) {
    if (vis[abs(m[add].value)] == 0) {
        v[0][v[0].size() - 1].next = m[add].add;
        v[0].pb(m[add]);
        vis[abs(m[add].value)] = 1;
    } else {
        if (v[1].size())
            v[1][v[1].size() - 1].next = m[add].add;
        v[1].pb(m[add]);
    }
    if (m[add].next != -1)
        dfs(m[add].next);
}

int main() {
    scanf("%d%d", &ini, &n);
    for (int i = 0; i < n; i++) {
        scanf("%d%d%d", &temp.add, &temp.value, &temp.next);
        m[temp.add] = temp;
    }
    v[0].pb(m[ini]);
    vis[abs(m[ini].value)] = 1;
    ini = m[ini].next;
    if (ini != -1)
        dfs(ini);
    if (v[0].size()) {
        v[0][v[0].size() - 1].next = -1;
        vector<Node>::iterator it;
        for (it = v[0].begin(); it != v[0].end(); it++) {
            printf("%05d %d ", (*it).add, (*it).value);
            if ((*it).next != -1)
                printf("%05d\n", (*it).next);
            else
                cout << -1 << endl;
        }
    }
    if (v[1].size()) {
        v[1][v[1].size() - 1].next = -1;
        vector<Node>::iterator it;
        for (it = v[1].begin(); it != v[1].end(); it++) {
            printf("%05d %d ", (*it).add, (*it).value);
            if ((*it).next != -1)
                printf("%05d\n", (*it).next);
            else
                cout << -1 << endl;
        }
    }
}

Last update: May 4, 2022
Back to top