1097. Deduplication on a Linked List (25)[链表]

来源:互联网 发布:excel2010数据分析 编辑:程序博客网 时间:2024/05/23 21:56

1. 原题:https://www.patest.cn/contests/pat-a-practise/1097

2.思路:

题意:链表题
给出一个静态链表信息,去掉所有数据值(绝对值)重复的结点。
最后输出挑选出的链表和废弃的被移除的结点组成的链表。
思路:
有多个方法,可以用数组。我这里用的stl里的map。
把读入的结点存入map中。
然后再从起点开始读,第一次出现的值的结点存入一个vector,重复的存入另一个。
最后分别输出即可。
已AC。

3. 源码:

#include <iostream>#include <map>#include <vector>#include <algorithm>using namespace std;const int maxN = 1e4 +5;struct Node//结点的结构体{int local;int data;int next;};void Print(vector<Node> &v);//输出链表int main(void){//freopen("in.txt", "r", stdin);int head, N;scanf("%d %d", &head, &N);map<int, Node> allData;//存储所有结点for (int i = 0; i < N; i++){Node tem;scanf("%d %d %d", &tem.local, &tem.data, &tem.next);allData.insert(make_pair(tem.local, tem));}int curAddr = head;//当前地址vector<Node> select, abandon;//分别存储挑选好的和被移除的int flag[maxN] = { 0 };//某个值是否第一次出现的标记数组while (curAddr != -1){int curData = abs(allData[curAddr].data);//取绝对值int nextAddr = allData[curAddr].next;if (flag[curData] == 0)//表示第一次出现{select.push_back(allData[curAddr]);flag[curData] = 1;}else{abandon.push_back(allData[curAddr]);}curAddr = nextAddr;}Print(select);Print(abandon);return 0;}void Print(vector<Node> &v)//输出链表{int len = v.size();for (int i = 0; i < len; i++){if (i == len - 1){printf("%05d %d -1\n", v[i].local, v[i].data);}else{printf("%05d %d %05d\n", v[i].local, v[i].data, v[i+1].local);}}return;}


0 0