代码参考自:http://blog.csdn.net/xunalove/article/details/64923723
#include <iostream> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <memory.h> /* 思路:将输入存放进数组,只要拿到去重后链表的头结点,和被删除链表的头结点,利用我们首先建立好的数组,就可以实现目标的输出 2017.8.13 作者:世界上最伟大最牛逼最屌的程序员 地点:西农 */ using namespace std; struct node { int data, next; } list1[100000]; int main() { int key[10000]; memset(key, 0, sizeof(key)); int beforeRemoveDuplicates[100000]; //record the address of linked list after move duplicates int Duplicates[100000]; //record the address of linked list duplicates int firstAddress, nodeNumber; cin >> firstAddress >> nodeNumber; int a, b, c; //三个变量,输入用 for(int i=0; i<nodeNumber; i++) { cin >> a >> b >> c; list1[a].data = b; list1[a].next = c; } int temp = firstAddress, t, i=0, j=0; //travel a number array as a temporary variable while(temp!=-1) { t = abs(list1[temp].data); if(key[t]==0) { key[t]=1; beforeRemoveDuplicates[i++] = temp; } else { Duplicates[j++] = temp; } temp = list1[temp].next; } printf("%05d %d", beforeRemoveDuplicates[0], list1[beforeRemoveDuplicates[0]].data); for(int k=1; k<i; k++) { printf(" %05d", beforeRemoveDuplicates[k]); printf("\n%05d %d", beforeRemoveDuplicates[k], list1[beforeRemoveDuplicates[k]].data); } cout << " -1" << endl; if(j!=0) { printf("%05d %d", Duplicates[0], list1[Duplicates[0]].data); for(int k=1; k<j; k++) { printf(" %05d", Duplicates[k]); printf("\n%05d %d", Duplicates[k], list1[Duplicates[k]].data); } cout << " -1" << endl; } //cout << "Hello world!" << endl; return 0; }
这位老铁的思路还是比较巧妙的,只要拿到每条链表对应的头结点,就可以实现输出。Key是绝对值不超过104的整数,key[;10000+1]; 这个地方会有测试点,如果空间不够大,则在使用memset()初始化时会掠过key[10000],导致本应在第一个链表中的元素被放进第二个
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。