链表思考

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

输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤10
5
,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 −1 来表示。

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

#include<bits/stdc++.h>
using namespace std;
const int N= 100000 + 5;
struct nod {
	int id, val, next;//
}zong[N];
int id_nod[N];//这个很重要,id是都知道的,那么如何找实际存储位置呢!,这么去找!
vector<int> del;
bool pan[N];
int main() {
	int first, n;
	cin >> first >> n;
	for (int i = 0; i < n; i++) {
		cin >> zong[i].id >> zong[i].val >> zong[i].next;
		id_nod[zong[i].id] = i;
	}
    pan[abs(zong[id_nod[first]].val)]=1;
    printf("%05d %d",zong[id_nod[first]].id,zong[id_nod[first]].val);
	// cout << zong[id_nod[first]].id << " " << zong[id_nod[first]].val;
	int index = zong[id_nod[first]].id;
	for (int i = 0; i < n; i++) {
		index = zong[id_nod[index]].next;
        if(index==-1)break;
		if (pan[abs(zong[id_nod[index]].val)] == 0) {
			pan[abs(zong[id_nod[index]].val)] = 1;
			printf(" %05d\n%05d %d", index, index, zong[id_nod[index]].val);
		}
		else {
			del.push_back(index);
		}
	}
	cout << " " << -1 << endl;
	if (!del.empty()) {
        printf("%05d %d",del[0],zong[id_nod[del[0]]].val);
		// cout << del[0] << " " << zong[id_nod[del[0]]].val;
		for (int i = 1; i < del.size(); i++) {
			printf(" %05d\n%05d %d", del[i], del[i], zong[id_nod[del[i]]].val);
		}
		cout << " " << -1 << endl;
	}
	return 0;
}
posted @ 2025-03-08 21:25  ghostyu1  阅读(22)  评论(0)    收藏  举报