1097.Deduplication on a Linked List (25)

本文介绍了一种在链表中去除重复元素的高效算法。通过为每个节点分配一个顺序值(order),该算法能够区分需要保留的节点和需要移除的重复节点。文中详细解释了算法的实现过程,并提供了一个C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1097.Deduplication on a Linked List (25)

pat-al-1097

2017-03-03

  • 使用order来记录是第几个结点,一个巧妙的方式分开了需要保留下来的结点和需要摘除的结点
/**
 * pat-al-1097
 * 2017-03-03
 * Cpp version
 * Author: fengLian_s
 */
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#define MAX 100010
using namespace std;
struct NODE
{
  int addr;
  int key;
  int next;
  int order;
}node[MAX];
bool cmp(NODE a, NODE b)
{
  return a.order < b.order;
}
int isExist[MAX] = {0};
int main()
{
  freopen("in.txt", "r", stdin);
  int start, n;
  scanf("%d%d", &start, &n);
  for(int i = 0;i < MAX;i++)
  {
    node[i].order = 2*MAX;
  }
  for(int i = 0;i < n;i++)
  {
    int address;
    scanf("%d", &address);
    scanf("%d %d", &node[address].key, &node[address].next);
    node[address].addr = address;
    //printf("%05d %d %05d %d\n", node[address].addr, node[address].key, node[address].next, node[address].order);
  }
  int index = start, orderResult = 0, orderRemove = 0;
  while(index != -1)
  {
    if(isExist[abs(node[index].key)] == 0)
    {
      isExist[abs(node[index].key)] = 1;
      node[index].order = orderResult++;
    }
    else
      node[index].order = MAX + orderRemove++;
    //printf("%05d %d %05d %d\n", node[index].addr, node[index].key, node[index].next, node[index].order);
    index = node[index].next;
  }
  sort(node, node+MAX, cmp);
  int cnt = orderResult+orderRemove;
  for(int i = 0;i < cnt;i++)
  {
    //printf("%05d %d %05d %d\n", node[i].addr, node[i].key, node[i].next, node[i].order);
    if(i != orderResult-1 && i != cnt-1)
      printf("%05d %d %05d\n", node[i].addr, node[i].key, node[i+1].addr);
    else
      printf("%05d %d -1\n", node[i].addr, node[i].key);
  }
  return 0;
}

-FIN-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值