zoukankan      html  css  js  c++  java
  • pta l2-2(链表去重)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184

    题意:给定一个链表,要求删除其中键值绝对值重复的结点然后输出,并将删除的结点组织成链表,也输出。

    思路:刚开始我是用创建静态链表的思路来做,没出现过的加入链表1,出现过的加入链表2,虽然有些麻烦,但应该是可行的,可样例始终过不了,找了一晚上错误是在不知道错在哪,就放弃了。在网上看了另一种做法,十分简单,用结构体,a[i].key表示地址i处的键值,a[i].nxt表示下一个地址,b数组用来存放重复结点的地址,vis数组用来标记是否出现过,

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn=100005;
     5 
     6 struct node{
     7     int key,nxt;
     8 }a[maxn];
     9 
    10 int b[maxn],vis[10005],n,m,v,ct,t1,t2,t3;
    11 
    12 int main(){
    13     scanf("%d%d",&m,&n);
    14     for(int i=0;i<n;++i){
    15         scanf("%d%d%d",&t1,&t2,&t3);
    16         a[t1].key=t2,a[t1].nxt=t3;
    17     }
    18     vis[abs(a[m].key)]=1;
    19     printf("%05d %d",m,a[m].key);
    20     while(1){
    21         m=a[m].nxt;
    22         if(m==-1){
    23             printf(" -1
    ");
    24             break;
    25         }
    26         if(!vis[abs(a[m].key)]){
    27             vis[abs(a[m].key)]=1;
    28             printf(" %05d
    %05d %d",m,m,a[m].key);
    29         }
    30         else
    31             b[ct++]=m;
    32     }
    33     if(ct>0){
    34         printf("%05d %d",b[0],a[b[0]].key);
    35         for(int i=1;i<ct;++i)
    36             printf(" %05d
    %05d %d",b[i],b[i],a[b[i]].key);
    37         printf(" -1
    ");
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    AWK
    正则表达式
    BASH
    C# 常用控件的一些属性及方法
    C# FTP
    C# Delegate
    DLL/EXE查看工具Dumpbin
    VBA 破解Excel工作表保护密码
    VB6 IP地址+网卡地址+网卡类型
    编程之路┊由C#风潮想起的——给初学编程者的忠告 ZT
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/10533842.html
Copyright © 2011-2022 走看看