题目链接: https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184
题意: 给定一个链表, 要求删除其中键值绝对值重复的结点然后输出, 并将删除的结点组织成链表, 也输出.
思路: 刚开始我是用创建静态链表的思路来做, 没出现过的加入链表 1, 出现过的加入链表 2, 虽然有些麻烦, 但应该是可行的, 可样例始终过不了, 找了一晚上错误是在不知道错在哪, 就放弃了. 在网上看了另一种做法, 十分简单, 用结构体, a[i].key 表示地址 i 处的键值, a[i].nxt 表示下一个地址, b 数组用来存放重复结点的地址, vis 数组用来标记是否出现过,
AC 代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn=100005;
- struct node{
- int key,nxt;
- }a[maxn];
- int b[maxn],vis[10005],n,m,v,ct,t1,t2,t3;
- int main(){
- scanf("%d%d",&m,&n);
- for(int i=0;i<n;++i){
- scanf("%d%d%d",&t1,&t2,&t3);
- a[t1].key=t2,a[t1].nxt=t3;
- }
- vis[abs(a[m].key)]=1;
- printf("%05d %d",m,a[m].key);
- while(1){
- m=a[m].nxt;
- if(m==-1){
- printf("-1\n");
- break;
- }
- if(!vis[abs(a[m].key)]){
- vis[abs(a[m].key)]=1;
- printf("%05d\n%05d %d",m,m,a[m].key);
- }
- else
- b[ct++]=m;
- }
- if(ct>0){
- printf("%05d %d",b[0],a[b[0]].key);
- for(int i=1;i<ct;++i)
- printf("%05d\n%05d %d",b[i],b[i],a[b[i]].key);
- printf("-1\n");
- }
- return 0;
- }
来源: http://www.bubuko.com/infodetail-2987714.html