7-1 链表去重 (25 分)

it2022-05-05  144

7-1 链表去重 (25 分)

题目 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。输入格式 输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤10​5​​,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。 随后 N 行,每行按以下格式描述一个结点:

地址 键值 下一个结点

其中地址是该结点的地址,键值是绝对值不超过10​4​​的整数,下一个结点是下个结点的地址。

输出格式 首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。

输入样例

00100 5 99999 -7 87654 23854 -15 00000 87654 15 -1 00000 -15 99999 00100 21 23854 输出样例 00100 21 23854 23854 -15 99999 99999 -7 -1 00000 -15 87654 87654 15 -1 代码 #include<bits/stdc++.h> using namespace std; struct node{ int key; int next; }; struct node L[100000]; bool flag[100000];//标志数组 int newL[100000],del[100000];//存放地址 int main() { int first,N,addr; cin>>first>>N; for(int i=0;i<N;i++)//输入 { cin>>addr; cin>>L[addr].key>>L[addr].next; } memset(flag,true,sizeof(flag));//对flag[100000]全部赋值1 int num1=0,num2=0; for(int i=first;i!=-1;) { int k=abs(L[i].key); if(flag[k])//K是第一个键值 { flag[k]=false; newL[num1++]=i;//把地址存进newL里面,新链表的地址 } else del[num2++]=i; i=L[i].next;//下一个结点,i作为数组下标 } printf("d %d ",newL[0],L[newL[0]].key); for(int i=1;i<num1;i++) { printf("d\n",newL[i]);//输出当前结点的地址,同时也是上一结点的next printf("d %d ",newL[i],L[newL[i]].key);//输出地址和键值 } printf("-1\n");//新链表结束 if(num2)//删掉的链表不空 { printf("d %d ",del[0],L[del[0]].key); for(int i=1;i<num2;i++) { printf("d\n",del[i]);//输出下一个节点的地址 printf("d %d ",del[i],L[del[i]].key);//输出地址和键值 } printf("-1\n"); } return 0; }

最新回复(0)