pat1097,选出链表中重复的值

本文介绍了如何使用静态链表和额外的order属性来解决找出链表中重复值的算法。通过为每个节点分配其应处位置的order,并按order排序,来揭示重复值。尽管这种方法已应用于部分样例,但仍有一个样例未通过测试。
摘要由CSDN通过智能技术生成

思路:
使用静态链表,多一个order的属性,来记录他应该所在的位置。然后按照order来排序。
但是:还有一个样例没有通过!!!

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100010;
struct node
{
    int address,data,next;
    int order;
}Node[maxn];
bool cmp(node a,node b){
    return a.order<b.order;
}
int main()
{
        bool isexit[1000010]={false};//哈希表
        memset(isexit,0,sizeof(isexit));

      int begin,n;
      scanf("%d %d",&begin,&n);
      int address;
      for(int i=0;i<n;i++){
        scanf("%d",&address);
        scanf("%d%d",&Node[address].data,&Node[address].next);
        Node[address].address=address;
      }
      for(int i=0;i<maxn;i++)
      {
          Node[i].order=maxn*2;//让每一个都是无效节点

      }
      int p=begin;
      int count1=0;//有效的
      int count2=0; //无效的
      while(p!=-1)
      {
          if(isexit[abs(Node[p].data)]==false){

            isexit[abs(Node[p].data)]=true;
            Node[p].order=count1++;
            p=Node[p].next;
          }else{
              Node[p].order=maxn+count2++;
              p=Node[p].next;
          }
      }
        sort(Node,Node+maxn,cmp);
        int count=count1+count2;
        int i;
        for( i=0;i<count1-1;i++){

            printf("%05d %d %05d\n",Node[i].address,Node[i].data,Node[i+1].address);
            }
        printf("%05d %d -1\n",Node[i].address,Node[i].data);
        for( i=i+1;i<count1+count2-1;i++){

            printf("%05d %d %05d\n",Node[i].address,Node[i].data,Node[i+1].address);
            }
            printf("%05d %d -1\n",Node[i].address,Node[i].data);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值