题目来源:团体程序设计天梯赛-练习集
题目地址:L2-002 链表去重

题目大意

将链表数据域的值相同(包含绝对值相同)的节点去掉,然后将去掉的节点又重新组成一条链表,最后输出去重后的链表和被去掉的节点组成的链表。样例表示如下:

题目分析

这道题的题目难度相对较低,只要你熟悉链表的遍历和删除操作,就可以顺利完成这道题。虽然话是那么说,但是用对了数据结构可以让解题事半功倍。

  • 设 lblblb 数组用于存储输入的链表,我们可以用数组下标表示当前节点地址,就可以避免遍历时寻址的麻烦
  • 设 rerere 数组用于存储被去除节点组成的链表,这时我们可以直接顺序存储被去除的节点,而且只需要存储节点的地址和数据域,这样我们就可以利用顺序知道每个下个节点的地址了。
  • 事实上,我们可以发现 lblblb 相当于链表,而 rerere 相当于顺序表。它们的存储示意图如下:

了解到上面这些,写代码已经顺利了(默认你会链表的遍历和删除),最后再说一下写题目踩到的坑:

  • 地址直接用 intintint 类型存储,没必要用 stringstringstring,否则无法用上上述存储结构(别跟我说用 mapmapmap ,我第一发就是这样超时的)。
  • 格式控制符 “%05d” 表示如果输出的字符少于5位时,在左边补 000 (默认是补空格)。
  • 删除操作需要用到前驱节点 preprepre 的指针 ,preprepre 在每次遇到不需要删除的节点时就要更新,如果单纯的直接用上一个节点,就可能用到被去除节点的地址。

代码如下

#include <bits/stdc++.h>using namespace std;
const int maxn = 1e5 + 10;
int n, cnt;
int one, s, pre;
/*** lb用于存储原始链表* re用于存储原始链表中的重复节点*/
pair<int, int> lb[maxn];
pair<int, int> re[maxn];
set<int> vis;int main()
{cin >> one >> n;for (int i = 1; i <= n; i++) {int address, num, next;cin >> address >> num >> next;lb[address] = make_pair(num, next);}cnt = 0;//遍历链表,s表示当前节点的地址for (s = one; s != -1; s = lb[s].second) {int num = lb[s].first;if (!vis.count(abs(num))) {vis.insert(abs(num));//pre记录下一个节点的前驱节点地址pre = s;} else {//链表删除重复节点操作lb[pre].second = lb[s].second;//将删除的节点存到另一条链表re[cnt].first = num;re[cnt].second = s;cnt++;}}for (s = one; s != -1; s = lb[s].second) {printf("%05d %d ", s, lb[s].first);if (lb[s].second != -1) printf("%05d\n", lb[s].second);else printf("-1\n");}for (int i = 0; i < cnt; i++) {printf("%05d %d ", re[i].second ,re[i].first);if (i != cnt - 1) printf("%05d\n", re[i + 1].second);else printf("-1\n");}return 0;
}

如果本文对你有所帮助,别忘了点赞哦~

L2-002 链表去重-团体程序设计天梯赛GPLT相关推荐

  1. L2-022 重排链表-PAT团体程序设计天梯赛GPLT

    给定一个单链表 L~1~→L~2~→-→L~n-1~→L~n~,请编写程序将链表重新排列为 L~n~→L~1~→L~n-1~→L~2~→-.例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5 ...

  2. L2-005 集合相似度-PAT团体程序设计天梯赛GPLT

    题目来源:团体程序设计天梯赛-练习集 题目地址:L2-005 集合相似度 题目大意 给定 nnn 个集合,然后有 kkk 次询问,每次询问都要求出 Nc/Nt×100%N_c / N_t \times ...

  3. L2-006 树的遍历-团体程序设计天梯赛GPLT

    题目来源:团体程序设计天梯赛-练习集 题目地址:L2-006 树的遍历 题目大意 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 预备知识: 中序遍历 ...

  4. L2-004 这是二叉搜索树吗?-团体程序设计天梯赛GPLT

    题目来源:团体程序设计天梯赛-练习集 题目地址:L2-004 这是二叉搜索树吗? 题目大意 给定一个长度为 nnn 的序列,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果.如果是,则在一行中输 ...

  5. L2-003 月饼-团体程序设计天梯赛GPLT

    题目来源:团体程序设计天梯赛-练习集 题目地址:L2-003 月饼 题目大意 题目给定月饼种类的数量和市场最大需求量,以及各个种类月饼的库存量.总售价.,请你计算可以获得的最大收益! 题目分析 这是一 ...

  6. L2-001 紧急救援-团体程序设计天梯赛GPLT

    题目来源:团体程序设计天梯赛-练习集 题目地址:L2-001 紧急救援 题目描述 题目大意 题目给出一张图,其中包括道路连接的城市和它们的距离,以及每个城市救援队的数量,最后求从出发地城市到目的地城市 ...

  7. L1-079 天梯赛的善良 (20 分)-PAT 团体程序设计天梯赛 GPLT

    天梯赛是个善良的比赛.善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分. 于是命题组首先将编程能力划分成了 106个等级( ...

  8. L1-078 吉老师的回归 (15 分)-PAT 团体程序设计天梯赛 GPLT

    曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦! 为了简化题目,我们不妨假设天梯赛的每道题目可以用一个不超过 500 的.只包括可打印符号的字符串描述出来,如:Problem A: Print &q ...

  9. [Python] L1-052 2018我们要赢-PAT团体程序设计天梯赛GPLT

    2018年天梯赛的注册邀请码是"2018wmyy",意思就是"2018我们要赢".本题就请你用汉语拼音输出这句话. 输入格式: 本题没有输入. 输出格式: 在第 ...

最新文章

  1. 解决mysql建立的数据库名字不能带大写字母
  2. pandas使用argmax函数返回给定series对象中最大值(max、maximum)的行索引实战
  3. php lyadmin,index.php
  4. CCF201312-5 I’m stuck!(100分)
  5. android 8.0以后(sdk26)启动前台服务的问题探究
  6. 实战脚本写入注册表,完善WindowsServer自动化运维
  7. SweetAlert插件 弹框插件
  8. 剑桥大学的组织架构和行政机构:学院高度自制
  9. 跨域问题的简单解决办法
  10. 记一次失败的Windows环境编译Nginx源码
  11. linux db2 ssl,IBM DB2 Content Manager V83与手工配置SSL
  12. ajax 限制显示条数,jquery通过ajax获取数据,控制显示的数据条数
  13. 取消多次重定向错误php,Laravel重定向您太​​多次错误
  14. CGI form标签学习
  15. 指定linux软件安装路径
  16. 自动登录SAP系统(流星程序集之十八)
  17. 永不消逝的电波-wirteup
  18. Python分析捕食者和被捕食者模型 Lotka--Volterra方程 | 拟合求解a,b,c,d
  19. 【佩服】超萌女娃穿尿裤扭臀热舞
  20. SpringBoot使用JavaMailSender发送邮件:com.sun.mail.smtp.SMTPSendFailedException: 451 MI:SFQ 163 smtp7

热门文章

  1. 写博客必备的复制黏贴
  2. [mmu/cache]-cache在linux和optee中的应用-InProgress
  3. Python中字典对象实现原理
  4. vc 限制软件的使用次数或时间
  5. 【python】简单记录
  6. 16、HTML密码框
  7. 7、MySQL数据类型的选择
  8. 1.17 Java.util.logging:JDK自带记录日志类
  9. C. Kefa and Park【树的遍历】
  10. Linux文件/目录 所有者/所在组