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是下一个结点的地址。

输出格式:

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

输入样例:

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

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

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

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

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

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<string>
#include<map>
#define maxn 400000
#define inf 0x3f3f3f3f
using namespace std;
#define N 100008
struct node{
int key,next;
}a[N];
int beg1,beg2;//两个链表的开头
bool vis[N];
int main(){
int n;
while(scanf("%d%d",&beg1,&n)!=EOF){
int add,key,next;
for(int i=;i<n;i++){
scanf("%d%d%d",&add,&key,&next);
a[add].key=key,a[add].next=next;
}
memset(vis,false,sizeof(vis));
int u=beg1;
beg2=-;
int bef1add=-;
int befadd;
while(u!=-){
if(vis[abs(a[u].key)]==true){//加入废弃的链接节点里
int u2=a[u].next;
if(beg2==-){
beg2=u;
befadd=u;
a[u].next=-;
}else{
a[befadd].next=u;
a[u].next=-;
befadd=u;
}
u=u2;
}
else{//非废弃的链表
if(bef1add!=-){
a[bef1add].next=u;
bef1add=-;
}
vis[abs(a[u].key)]=true;
int u2=a[u].next;
if(vis[abs(a[u2].key)]==true){
a[u].next=-;
bef1add=u;
}
u=u2;
}
} //输出
cout<<endl;
while(beg1!=-){
if(a[beg1].next==-)
printf("%05d %d %d\n",beg1,a[beg1].key,-);
else
printf("%05d %d %05d\n",beg1,a[beg1].key,a[beg1].next);
beg1=a[beg1].next;
} while(beg2!=-){
if(a[beg2].next==-)
printf("%05d %d %d\n",beg2,a[beg2].key,-);
else
printf("%05d %d %05d\n",beg2,a[beg2].key,a[beg2].next);
beg2=a[beg2].next;
} } return ;
}

【数组模拟的链表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. 什么是 CDN(超形象)

    原文地址:https://blog.csdn.net/lu_embedded/article/details/80519898 618电商节.双十一购物狂欢节,到底是什么在支撑数以万计的秒杀活动?这就 ...

  2. Linux下操作数据库

    一.安装数据库   1.卸载旧版本 检查是否安装有MySQL Server:rpm -qa | grep mysql rpm -e mysql_libs   //普通删除模式 rpm -e --nod ...

  3. 虚拟机性能监控与故障处理工具(深入理解java虚拟机三)

    JDK自带的工具可以方便的帮助我们处理一些问题,包括查看JVM参数,分析内存变化,查看内存区域,查看线程等信息. 我们熟悉的有java.exe,javac.exe,javap.exe(偶尔用),jps ...

  4. Tomcat报错:No result type specified for result named 'success'

    今天学Struts, tomcat报出了异常信息 Exception starting filter [struts2] Unable to load configuration.还有 No resu ...

  5. Windows10+Anaconda+PyTorch(cpu版本)环境搭建

    1.安装Anaconda,具体参考网上相关教程 2.安装PyTorch 2.1 在Anaconda自带的Anaconda Prompt中创建名为PyTorch的虚拟环境[conda create -- ...

  6. git基本使用及分支切换命令

    git init 生成本地仓库 git status  查看本地文件状态,未提交的文件显示红色 git add .  (点表示提交所有文件到暂存区,也可指定部分文件到暂存区,填写指定文件名加路径即可) ...

  7. golang 单元测试(一)

    单元测试函数类型 Test(功能测试) 函数规则: 函数名: TestXxxx , 以Test为前缀.Xxxx以大写字母开头 参数类型: *testing.T func TestXxxx(t *tes ...

  8. 【hash】Power Strings

    [题意]: 给出s串出来,能否找到一个前缀 ,通过多次前缀进行拼接.构成s串.如果有多个,请输出最多次数那个. 如:aaaa 可以用1个a,进行4次拼接 可以用2个a,进行2次拼接 可以用4个a,进行 ...

  9. Linux权限管理:ACL 权限

    1.ACL 是什么 ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表.它在UGO权限管理的基础上为文件系统提供一个额外的.更灵活的权限管理机 ...

  10. 路由基础(Routing)

    查看本机路由表: [root@controller02 ~]# cat /etc/iproute2/rt_tables # # reserved values # 255     local 254  ...