一、题目
二、解题思路
- 结构体数组的下标表示该节点的地址,value 表示该节点的值,next 表示下一个结点的地址。
- result1 表示去重后的链表的节点的地址,result2 表示被删除的链表的节点的地址。
- flag 表示节点对应的值是否出现过,默认为 0 ,没有出现。
- 循环链表(结束条件是下一个节点的地址为 -1 ),如果这个节点的值出现过,则在 result2 记录该节点的地址;如果这个节点的值没有出现过,则在 result1 记录该节点的地址,并在flag中将该节点的值标记为出现过,每次条件判断完之后更新 index 。
- 输出节点的地址,节点的值,下一个节点的地址,注意最后一个节点的下一个节点的地址输出为 -1 。
三、代码
#include<iostream>
using namespace std;
#include<cmath>
//结构体数组的下标表示该节点的地址,value 表示该节点的值,next 表示下个结点的地址
struct List
{
int value;
int nextkey;
}a[100005];
int main()
{
int index,n;
// result1 表示去重后的链表的节点的地址
// result2 表示被删除的链表的节点的地址
int k1=0,k2=0,result1[100005],result2[100005];
// flag 表示节点对应的值是否出现过,默认为0,没有出现
int flag[100005]={0};
cin>>index>>n;
for(int i=0;i<n;i++)
{
int key;
cin>>key;
cin>>a[key].value>>a[key].nextkey;
}
while(index!=-1)
{
// 如果这个节点的值出现过,则在result2记录该节点的地址
if(flag[abs(a[index].value)])
{
result2[k2++]=index;
}
// 如果这个节点的值没有出现过,则在result1记录该节点的地址,并在flag中将该节点的值标记为出现过
else
{
result1[k1++]=index;
flag[abs(a[index].value)]=1;
}
// 更新 index
index=a[index].nextkey;
}
// 输出
// 节点的地址 节点的值 下一个节点的地址
for(int i=0;i<k1;i++)
{
if(i==k1-1)
{
printf("%05d %d -1\n",result1[i],a[result1[i]].value);
}
else
{
printf("%05d %d %05d\n",result1[i],a[result1[i]].value,result1[i+1]);
}
}
for(int i=0;i<k2;i++)
{
if(i==k2-1)
{
printf("%05d %d -1\n",result2[i],a[result2[i]].value);
}
else
{
printf("%05d %d %05d\n",result2[i],a[result2[i]].value,result2[i+1]);
}
}
}
四、总结
利用数组下标:
- 结构体数组的下标表示该节点的地址。
- flag 表示节点对应的值是否出现过。