pat L2-002 链表去重
Posted swiftac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pat L2-002 链表去重相关的知识,希望对你有一定的参考价值。
题目大意:对一个链表进行去重操作,如果一个数字的绝对值已经出现过了,就取出这个节点,组成一个新的链表。
分析:直接模拟就好了。刚开始的时候对五位数是用string进行处理的,然后tle,然后还有dfs1e5次导致re。好迷啊这个题,写了一个多小时。有毒!!!
代码:
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+7; struct node{ int data; int next; int pos; }a[maxn]; map<int,bool> vis; node rem[maxn],del[maxn]; int rem_num,del_num; void dfs(int pos) { rem_num = del_num = 0; while (pos != -1) { if (vis[abs(a[pos].data)]) del[del_num].data = a[pos].data, del[del_num].next = -1, del[del_num].pos = pos, del_num++; else rem[rem_num].data = a[pos].data, rem[rem_num].next = -1, rem[rem_num].pos = pos, rem_num++; vis[abs(a[pos].data)] = true; pos = a[pos].next; } } int main() { int n, start, now, nex, x; cin >> start >> n; for (int i = 0; i < n; i++) { cin >> now >> x >> nex; a[now].next = nex; a[now].data = x; } dfs(start); if (rem_num) { for (int i = 0; i < rem_num - 1; i++) printf("%05d %d %05d ", rem[i].pos, rem[i].data, rem[i + 1].pos); printf("%05d %d %d ", rem[rem_num-1].pos, rem[rem_num-1].data, -1); } if (del_num) { for (int i = 0; i < del_num - 1; i++) printf("%05d %d %05d ", del[i].pos, del[i].data, del[i + 1].pos); printf("%05d %d %d ", del[del_num-1].pos, del[del_num-1].data, -1); } return 0; }
以上是关于pat L2-002 链表去重的主要内容,如果未能解决你的问题,请参考以下文章