链表去重

Posted xcfxcf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表去重相关的知识,希望对你有一定的参考价值。

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

输入格式:

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

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

地址 键值 下一个结点

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

输出格式:

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

输入样例:

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

刚开始想的是一个结构体,分别存放地址,键值,下一个的地址,然后呢,怎么找?
去网上看到大佬写的是结构体里面存放键值 和下一个的地址
在一个问题是输出的时候应该怎么办?
我们可以建立数组,vis表示是否输出过,b记录重复的

输出的时候要注意地址。找的时候 是按照地址顺序找完的,但是输出的时候不一定是,
因为先输出不重复的,大佬的处理方法很巧妙。
输出两次这个地址,
这样很简单的解决了这个问题
再一点就是读入的时候不要给什么读什么,形式可以变变
技术图片
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
struct node{
    int key,nxt;//键值 下一个
}a[maxn];
int vis[maxn],b[maxn],cnt;
int l,n;
int main(){
    //freopen("in","r",stdin);
    scanf("%d %d",&l,&n);
    for(int i = 0; i < n; i++){
        int t1,t2,t3;
        scanf("%d %d %d",&t1,&t2,&t3);
        a[t1].key = t2;
        a[t1].nxt = t3;
    }
    vis[abs(a[l].key)] = 1;
    printf("%05d %d",l,a[l].key);
    while(1){
        l = a[l].nxt;
        if(l == -1){
            printf(" -1
");
            break;
        }
        if(!vis[abs(a[l].key)]){
            vis[abs(a[l].key)] = 1;
            printf(" %05d
%05d %d",l,l,a[l].key);
        }else b[cnt++] = l;
    }
    if(cnt) {
        printf("%05d %d",b[0],a[b[0]].key);
        for (int i = 1; i < cnt; i++)
            printf(" %05d
%05d %d", b[i],b[i],a[b[i]].key);
        printf(" -1
");
    }
    return 0;
}
View Code

 



以上是关于链表去重的主要内容,如果未能解决你的问题,请参考以下文章

pat L2-002 链表去重

L2-002 链表去重 (25 分)

链表去重

链表去重

链表去重

L2-002 链表去重(链表+模拟)