2019-05-09 团体程序设计天梯赛-练习集 L2-002 链表去重 (25 分)

/*

****************本题大致思路:*****************

首先是数据存储,用map存 第一个数据(string)是键  2,3数据(class)是值

然后遍历这个“链表”

对于每个链表的数据,首先看此数据之前出现过没(绝对值一样就算出现过),出现过就添加到vector中,

没有就把绝对值添加到set中(此set就能看出哪个数据出现过),并且输出

最后遍历输出vector

*/

#include<iostream>

#include<vector>

#include<set>

#include<map>

#include<string>

#include<algorithm>

#define iIN(L,R) for(int i=L;i<R;i++) 

using namespace std;

class Data

{

public:

int num;

string next;

Data(){} //这个构造函数必须有

Data(int n1,string n2){

num=n1;

next=n2;

}

void operator=(Data d){

this->num=d.num;

this->next=d.next;

}

};

map<string,Data> M;//核心数据结构

vector<string> vec;

vector<int>    vec2;//两个vector 装题目中所说的被删除的链表

set<int> S;        //装第一次出现的num的绝对值

int main()

{

string now;

int N;

string key;

int num;

string snum;

string next;

Data box;

stringstream water;

cin>>now>>N;

iIN(0,N){

cin>>key>>num>>next;

Data *d=new Data(num,next);

M[key]=*d;

}

int mark=0;

while(1){

if(now=="-1")

{

cout<<" "<<-1<<endl;

break;

}

box=M[now];

num=box.num;

next=box.next;

if(S.count(abs(num))==0){ //第一次出现

if(mark){ //控制输出格式

cout<<" "<<now<<endl<<now<<" "<<num;

}

else

{

mark=1;

if(now!="-1")

cout<<now<<" "<<num;

}

S.insert(abs(num));

}

else{                //非第一次

vec.push_back(now);

vec2.push_back(num);

}

now=next;

}

mark=0;

iIN(0,vec.size()){

if(mark){

cout<<" "<<vec[i]<<endl<<vec[i]<<" "<<vec2[i];

}

else{

mark=1;

cout<<vec[i]<<" "<<vec2[i];

}

}

if(vec.size()>0)

cout<<" "<<-1<<endl;

return 0;

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容