news 2026/6/10 17:14:17

[pta]L2-002 链表去重

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[pta]L2-002 链表去重

L2-002 链表去重

分数 25

作者 陈越

单位 浙江大学

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

输入格式:

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

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

地址 键值 下一个结点

其中地址是该结点的地址,键值是绝对值不超过104的整数,下一个结点是下个结点的地址。

输出格式:

首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。

输入样例:

00100 5 99999 -7 87654 23854 -15 00000 87654 15 -1 00000 -15 99999 00100 21 23854

输出样例:

00100 21 23854 23854 -15 99999 99999 -7 -1 00000 -15 87654 87654 15 -1

我的想法:

我的想法很直接,既然地址这东西是唯一的,而且都是五位数,直接先开两个数组key和nxt来存储链表的键值和下一个地址,而这两个的数组的下标就用相应的当前的地址就行了

然后开一个list来顺序整理当前的地址

然后再开一个keep和dei,一个顺序记录去重后的地址,一个顺序记录键值重复的地址,开一个vs数组来记录键值是否重复

遍历list,不是重复的就放进keep,是重复的就放进del

输出这一步比较关键,把当前地址和键值看做一个整体,一起输出,至于下一个地址,显然,和下一行(如果有的话)的当前地址一致,那么直接输出keep[i+1]或者del[i+1]就行了,这样就不用考虑已修改原本存的下一个地址了

代码如下

#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int key[N], nxt[N], n, head; int main() { cin >> head >> n; for (int i = 0; i < n; i++) { int add; cin >> add; cin >> key[add] >> nxt[add]; } vector<int>list; for (int p = head; p != -1; p = nxt[p]) { list.push_back(p); } vector<int>keep, del; int vs[N] = { 0 }; for (auto add : list) { int abskey = abs(key[add]); if (!vs[abskey]) { keep.push_back(add); vs[abskey] = 1; } else del.push_back(add); } for (int i = 0; i < keep.size(); i++) { printf("%05d %d ", keep[i], key[keep[i]]); if (i == keep.size() - 1)printf("-1\n"); else printf("%05d\n", keep[i + 1]); } for (int i = 0; i < del.size(); i++) { printf("%05d %d ", del[i], key[del[i]]); if (i == del.size() - 1)printf("-1\n"); else printf("%05d\n", del[i + 1]); } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 23:16:22

结构体(Java 类)实战题解笔记(持续更新)

前言 Java也可以有结构体吗&#xff1f; 在 Java 中并没有直接的「结构体」概念&#xff0c;但可以通过自定义类&#xff08;class&#xff09; 实现结构体的核心功能——封装一组具有关联关系的数据。本笔记通过实战题目&#xff0c;讲解如何用自定义类存储复杂数据、处理业务…

作者头像 李华
网站建设 2026/6/10 13:35:19

【Linux系统】进程间通信:基于匿名管道实现进程池

1. 进程池介绍 ​ 1.1 核心定义 进程池&#xff08;Process Pool&#xff09; 是一种预创建复用式的进程管理技术&#xff0c;其本质是操作系统中预分配的进程资源容器。它包含两大核心组件&#xff1a; 资源进程&#xff1a;池中预先创建的空闲进程&#xff0c;随时待命执…

作者头像 李华
网站建设 2026/6/10 13:33:07

第 8 篇:适配器模式 (Adapter) —— 换芯片不换代码

专栏导读:适配器模式就像我们出国的“电源转换插头”。你(业务层)需要的是标准的 220V 两孔插座,而墙上(硬件层)提供的是美标、英标、欧标各种奇形怪状的插孔。适配器负责在中间做一次“翻译”,让你根本不需要关心墙后面是核电还是水电。 1. 场景还原 (The Pain) 假设你…

作者头像 李华
网站建设 2026/6/10 13:34:45

Python中 .whl 后缀文件的全称

你想了解Python中.whl后缀文件的全称&#xff0c;以及文件名各部分的含义&#xff0c;对吧&#xff1f; 首先先纠正一个小偏差&#xff0c;.whl的全称不是“啥”&#xff0c;而是Wheel&#xff08;字面意思是“轮子”&#xff09;&#xff0c;它是Python的一种预编译软件包格式…

作者头像 李华
网站建设 2026/6/10 2:22:02

Type-C 领夹麦的核心痛点与 PD 协议解决方案

领夹麦作为直播、录音场景的核心设备&#xff0c;长期面临三大技术瓶颈&#xff1a;传统单接口无法同时实现 “音频传输 快充供电”&#xff0c;导致直播中途断电&#xff1b;充电电流干扰音频信号&#xff0c;产生底噪&#xff1b;设备兼容性差&#xff0c;难以适配多品牌手机…

作者头像 李华
网站建设 2026/6/10 13:45:57

凌晨两点调 API 调到崩溃,直到 MCP 出现——AI 终于有了统一接口

凌晨两点&#xff0c;第三杯咖啡见底&#xff0c;我盯着屏幕上那堆 API 文档想骂人。 OpenAI 一套鉴权&#xff0c;Claude 一套格式&#xff0c;Gemini 又是另一套。每接入一个新模型&#xff0c;就得重写一遍适配层。这活儿跟给不同品牌手机各做一根充电线有什么区别&#xff…

作者头像 李华