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

输入说明
输入的第一行包含两个整数,分别表示链表第一个结点的地址和结点个数 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;
}

浙公网安备 33010602011771号