L2-002. 链表去重

给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点。即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留。同时,所有被删除的结点必须被保存在另外一个链表中。例如:另L为21→-15→-15→-7→15,则你必须输出去重后的链表21→-15→-7、以及被删除的链表-15→15。【删除后的节点全部接到一个新的链表里】

输入格式:

输入第一行包含链表第一个结点的地址、以及结点个数N(<= 105 的正整数)【数据范围不大,可以考虑用结构体数组存贮整体信息】。结点地址是一个非负的5位整数,NULL指针用-1表示。

随后N行,每行按下列格式给出一个结点的信息:

Address Key Next

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

输出格式:

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

输入样例:

  1. 00100 5
  2. 99999 -7 87654
  3. 23854 -15 00000
  4. 87654 15 -1
  5. 00000 -15 99999
  6. 00100 21 23854
    【输出时,要求分成两部分进行处理!每个地址要求占到5位,但是-1需要特殊考虑!】

  1. AC题解:
    还是用数组模拟的链表哦!

befadd是“before-address”的简写,表示第一个链表的当前需要插入的节点的上个节点!

befadd2是“before-address2”的简写,表示第二个链表表示废弃链表的当前需要插入的节点的上个节点!

注意每次都要及时封住链表的尾部!

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<set>
  8. #include<string>
  9. #include<map>
  10. #define maxn 400000
  11. #define inf 0x3f3f3f3f
  12. using namespace std;
  13. #define N 100008
  14. struct node{
  15. int key,next;
  16. }a[N];
  17. int beg1,beg2;//两个链表的开头
  18. bool vis[N];
  19. int main(){
  20. int n;
  21. while(scanf("%d%d",&beg1,&n)!=EOF){
  22. int add,key,next;
  23. for(int i=;i<n;i++){
  24. scanf("%d%d%d",&add,&key,&next);
  25. a[add].key=key,a[add].next=next;
  26. }
  27. memset(vis,false,sizeof(vis));
  28. int u=beg1;
  29. beg2=-;
  30. int bef1add=-;
  31. int befadd;
  32. while(u!=-){
  33. if(vis[abs(a[u].key)]==true){//加入废弃的链接节点里
  34. int u2=a[u].next;
  35. if(beg2==-){
  36. beg2=u;
  37. befadd=u;
  38. a[u].next=-;
  39. }else{
  40. a[befadd].next=u;
  41. a[u].next=-;
  42. befadd=u;
  43. }
  44. u=u2;
  45. }
  46. else{//非废弃的链表
  47. if(bef1add!=-){
  48. a[bef1add].next=u;
  49. bef1add=-;
  50. }
  51. vis[abs(a[u].key)]=true;
  52. int u2=a[u].next;
  53. if(vis[abs(a[u2].key)]==true){
  54. a[u].next=-;
  55. bef1add=u;
  56. }
  57. u=u2;
  58. }
  59. }
  60.  
  61. //输出
  62. cout<<endl;
  63. while(beg1!=-){
  64. if(a[beg1].next==-)
  65. printf("%05d %d %d\n",beg1,a[beg1].key,-);
  66. else
  67. printf("%05d %d %05d\n",beg1,a[beg1].key,a[beg1].next);
  68. beg1=a[beg1].next;
  69. }
  70.  
  71. while(beg2!=-){
  72. if(a[beg2].next==-)
  73. printf("%05d %d %d\n",beg2,a[beg2].key,-);
  74. else
  75. printf("%05d %d %05d\n",beg2,a[beg2].key,a[beg2].next);
  76. beg2=a[beg2].next;
  77. }
  78.  
  79. }
  80.  
  81. return ;
  82. }
  1.  

【数组模拟的链表or复杂模拟】PAT-L2-002. 链表去重的更多相关文章

  1. Linux 内核 链表 的简单模拟(2)

    接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...

  2. Linux 内核 链表 的简单模拟(1)

    第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...

  3. 【链表】【模拟】Codeforces 706E Working routine

    题目链接: http://codeforces.com/problemset/problem/706/E 题目大意: 给一个N*M的矩阵,Q个操作,每次把两个同样大小的子矩阵交换,子矩阵左上角坐标分别 ...

  4. PAT甲级专题|链表

    PAT链表专题 关于PAT甲级的链表问题,主要内容 就是"建立链表" 所以第一步学会模拟链表,pat又不卡时间,这里用vector + 结构体,更简洁 模拟链表的普遍代码 cons ...

  5. PAT B1025 反转链表 (25 分)

    给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4,则输出应该 ...

  6. PAT Basic 1075 链表元素分类(25) [链表]

    题目 给定⼀个单链表,请编写程序将链表元素进⾏分类排列,使得所有负值元素都排在⾮负值元素的前⾯,⽽[0, K]区间内的元素都排在⼤于K的元素前⾯.但每⼀类内部元素的顺序是不能改变的.例如:给定链表为 ...

  7. PAT Basic 反转链表 (25) [链表]

    题目 给定⼀个常数K以及⼀个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4:如果K为4,则输出应该为4→3→2→1→5→6, ...

  8. 代码随想录第四天| 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、160.链表相交、142.环形链表II

    今天链表致死量 第一题 public static class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { ...

  9. 牛客网:将两个单调递增的链表合并为一个单调递增的链表-Python实现-两种方法讲解

    方法一和方法二的执行效率,可以大致的计算时间复杂度加以对比,方法一优于方法二   1. 方法一: 思路: 1. 新创建一个链表节点头,假设这里就叫 head3: 2. 因为另外两个链表都为单调递增,所 ...

  10. c++单链表冒泡排序(交换结点),链表增删改查,运算符重载

    #include <iostream> #include <stdlib.h> #include <time.h> #include <fstream> ...

随机推荐

  1. 如何解决mac brew遇到无法下载的依赖?

    使用brew安装软件时,需要下载依赖包,但是如果依赖包特别大的时候,就很容易失败:brew本身不支持断点续传:但是可以使用wget -c的方式断点续传的下载依赖:下载完如何给brew安装使用呢?参考: ...

  2. Spring MVC如何获取请求中的参数

    目录 一.获取URL中路径参数 1.1 @PathVariable 注解 1.2 @PathParam 注解 二.获取请求参数: 2.1 GET请求 2.1.1 获取请求中的单个参数:@Request ...

  3. servlet中ServletContainerInitializer的简单说明

    根据官方文档到的说明 public interface ServletContainerInitializer Interface which allows a library/runtime to ...

  4. idea添加svn项目的两种方法

    1.是直接用svn客户端检出后,在idea直接打开其项目. 2.直接在idea里面拉取svn的项目

  5. [DFS]排队(间隔排列)-C++

    Description 小Q是班长.在校运动会上,小Q班要进行队列表演.小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为1 ...

  6. spring 整合guava

    一.ApplicationContext.xml中的配置 <!--开启缓存注解--> <cache:annotation-driven /> <bean id=" ...

  7. Git服务器搭建--ssh/http

    测试环境 Windows 7 Ultimate, 64-bit 6.1.7601, Service Pack 1(实体机,虚拟机VMware的宿主机) VMware® Workstation 7.1. ...

  8. docker 实践八:docker-compose

    本篇介绍 docker 官方三剑客之一的 docker-compose. 注:环境为 CentOS7,docker 19.03. docker-compose docker-compose 的前身是开 ...

  9. 学习RadonDB源码(三)

    1. 所谓第四代语言 SQL是一种典型的第四代语言,即4GL,这种语言的突出特点是编写者不需要关注怎么做,只需要告诉系统我要什么就可以. 虽然4GL是这样的一种语言,大大简化了编写者的编写难度,其实底 ...

  10. 在Linux上安装Zookeeper集群

    xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.——这才是真正的堪称强大!! - ...