L2-002 链表去重(25分)

版本一:
代码非常烂。
一个元素加入之前,修改集合中(va,vb)最后一个元素的下一个地址为当前元素的地址。
然后我是把(元素地址,下一个地址)和(元素的值)拆开放到两个集合了,放一个里面有点麻烦不太会处理。

#include <bits/stdc++.h>
using namespace std;
int vis[10010];//是否已经来过 
vector<pair<string, string>> va, vb;//va保留下来 vb删除掉的  
vector<int> av, bv;
int main() {
	string s;
	int n;
	cin >> s >> n;//s第一个节点的地址 n总共的节点数量 
	map<string, pair<string, int>> mp;//需要根据其实地址找到下一个地址 
	for (int i = 0; i < n; i++) {
		string a, c;
		int b;
		cin >> a >> b >> c;
		pair<string, int> pr;
		pr.first = c;
		pr.second = b;
		mp[a] = pr;
	}
	vis[abs(mp[s].second)] = 1;
	va.push_back(make_pair(s, "-1"));
	av.push_back(mp[s].second);
	string x = s;
	while (mp[x].first != "-1") {
		//处理父亲
		pair<string, string> npr;//创建新节点 
		string parent = mp[x].first;
		int parentv = mp[parent].second;
		if (!vis[abs(parentv)]) {//没有出现过 
			pair<string, string> pr = va.back();//起始下一个 
			pr.second = parent;
			va.pop_back();
			va.push_back(pr);
			npr.first = parent;
			npr.second = "-1";
			va.push_back(npr);
			av.push_back(parentv);
			vis[abs(parentv)] = 1;
		}
		else {
			pair<string, string> pr;//起始下一个 
			if (!vb.empty()) {
				pr = vb.back();
				pr.second = parent;
				vb.pop_back();
				vb.push_back(pr);
				npr.first = parent;
				npr.second = "-1";
				vb.push_back(npr);
				bv.push_back(parentv);
			}
			else {
				pr.first = parent;
				pr.second = "-1";
				vb.push_back(pr);
				bv.push_back(parentv);
			}
		}
		x = parent;
	}
	for (int i = 0; i < va.size(); i++) {
		cout << va[i].first << " " << av[i] << " "<<va[i].second << endl;
	}
	for (int i = 0; i < vb.size(); i++) {
		cout << vb[i].first << " " << bv[i] << " "<<vb[i].second << endl;
	}
	return 0;
}

版本二:
翻阅了其他博客之后.....上面我一直在试图去修正next的值,其实这个步骤是完全没必要做的,直接添加到集合当中就行了。
然后是在遍历方式上做出了改变,逻辑上真的清晰了太多。

#include <bits/stdc++.h>
using namespace std;
int vis[10010];
int main() {
	map<string,pair<string,int>> mp;
	vector<string> va,vb;
	string s;
	int n;
	cin>>s>>n;
	for(int i=0; i<n; i++) {
		string a,c;
		int b;
		cin>>a>>b>>c;
		mp[a]=make_pair(c,b);
	}
	while(s!="-1") {
		int x=mp[s].second;//取出数字
		if(!vis[abs(x)]) { //如果没出现过 将地址放进去
			va.push_back(s);
			vis[abs(x)]=1;
		} else {
			vb.push_back(s);
		}
		s=mp[s].first;
	}
	int asize=va.size();
	int bsize=vb.size();
	for(int i=0;i<asize-1;i++){
		cout<<va[i]<<" "<<mp[va[i]].second<<" "<<va[i+1] << endl;
	}
	if(asize>=1){
		cout<<va[asize-1]<<" "<<mp[va[asize-1]].second<<" -1"<<endl;
	}
	for(int i=0;i<bsize-1;i++){
		cout<<vb[i]<<" "<<mp[vb[i]].second<<" "<<vb[i+1] << endl;
	}
	if(bsize>=1){
		cout<<vb[bsize-1]<<" "<<mp[vb[bsize-1]].second<<" -1"<<endl;
	}
	return 0;
}
posted @ 2024-03-14 11:48  YuKiCheng  阅读(19)  评论(0编辑  收藏  举报