【XDOJ2026秋数据结构】745.链表去重【Compash个人题解】

745.链表去重

问题描述
给定一个键值为整数的单链表 L,将键值的绝对值有重复的结点删除:即对任意键值 K,只有键值或其绝对值等于 K 的第一个结点被保留在 L 中。例如,下面单链表 L 包含键值 21、-15、15、7、-15,如下图(a)所示;去重后的链表 L 包含键值 21、-15、7,如下图(b)所示。

屏幕截图 2026-10-12 212423

输入说明
输入的第一行包含两个整数,分别表示链表第一个结点的地址和结点个数 n(1≤n≤100)。结点地址是一个非负的 5 位整数,NULL 指针用-1 表示。
随后 n 行,每行含 3 个整数,按下列格式给出一个结点的信息:
Address Key Next
其中 Address 是结点的地址,Key 是绝对值不超过 10000 的整数,Next 是下一个结点的地址。

输出说明
输出的第一行为去重后链表 L 的长度,换行;接下来按顺序输出 L 的所有结点,每个结点占一行,按照 Address Key Next 的格式输出,间隔 1 个空格。

输入样例

//输入样例 1
00100 5
99999 7 87654
23854 -15 00000
87654 -15 -1
00000 15 99999
00100 21 23854

输出样例

//输出样例 1
3
00100 21 23854
23854 -15 99999
99999 7 -1

#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
struct ListNode
{
	int key;
	int address;
	int next;
	ListNode(int a,int k,int n): address(a), key(k), next(n){}
};
std::vector<ListNode> list;
std::vector<ListNode> reslist;
std::vector<int> nums;

bool isNumExisted(int num)
{
	bool isExisted = false;
	for(auto item : nums)
	{
		if(item == num)
		{
			isExisted = true;
			return true;
		}
	}
	return false;
}
ListNode& getNodeByAddress(int address)
//由地址得到结点
{
	static ListNode dummy(-1,0,1);
	//若寻找地址为-1,返回空结点 
	if(address == -1)
	{
		return dummy;
	}
	int index = 0;
	for(auto item : list)
	{
		if(address == item.address)
		{
			return list[index];
		}
		index++;
	}
	return dummy;
}
void conduct(int head)
{
	int cur = head; 
	//若空节点或1个结点
	while(cur != -1)
	{
		ListNode& node = getNodeByAddress(cur);
		if(node.address == -1) break;
		//如果已经存在key 
		if(!isNumExisted(abs(node.key))) 
		{
			nums.push_back(abs(node.key));
			reslist.push_back(node);
		}
		cur = node.next;
	}
	//连接next 
	for(int i = 0; i<reslist.size();i++)
	{
		if(i+1<reslist.size())
		{
			reslist[i].next = reslist[i+1].address;
		}
		else reslist[i].next = -1;
	}
}
int main()
{
	int n;
	int address,key,next,head; 
	std::cin>>head>>n;
	while(n--)
	{
		std::cin>>address>>key>>next;
		//插入节点 
		list.push_back(ListNode(address,key,next));
	}
	conduct(head);
	std::cout<<reslist.size()<<std::endl; 
	for(int i = 0;i<reslist.size();i++)
	{
		std::cout<<std::setw(5)<<setfill('0')<<reslist[i].address<<' '<<reslist[i].key<<' '; 
		if(reslist[i].next == -1)
		{
			std::cout << "-1";
		}
		else
		{
			std::cout << std::setw(5) << std::setfill('0') << reslist[i].next << std::endl;
		}
	}
	return 0;
}
posted @ 2026-10-12 21:25  Compash  阅读(3)  评论(0)    收藏  举报