#include <iostream>
#include <algorithm>
using namespace std;
const int MAX=1e6+10;
int hashTable[MAX]={0};
struct ListNode{
int val,next;
bool flag; //flag==true,说明之前存在与该结点相等的结点,当前结点需要进行删除(插入到第二个链表中)
}Node[MAX];
void deduplication(int begin,int &s1,int &s2){ //利用动态链表的方法解决静态链表的问题
s1=100001,s2=100002; //s1需要保留链表的头指针,s2需要删除链表的头指针
int p=s1,q=s2; //p,q指向s1,s2结点的尾指针
Node[s1].next=-1,Node[s2].next=-1; //初始化s1,s2为只含头结点的链表
while(begin != -1){ //原来的链表不空
if (Node[begin].flag){ //该结点需要插入到s2链表当中,(q->next=begin,q=begin)的静态写法
Node[q].next=begin;
q=begin;
}else{
Node[p].next=begin; //该结点需要插入到s1链表当中,(p->next=begin,p=begin)的静态写法
p=begin;
}
begin=Node[begin].next; //(p=p->next)继续扫描剩下的结点
}
Node[p].next=Node[q].next=-1; //链表中的结点插入之后,将s1,s2的next置为空
s1=(Node[s1].next == -1) ? -1 : Node[s1].next; //所有结点都需要进行删除,则s1链表为空,令s1=-1,否则返回s1->next
s2=(Node[s2].next == -1) ? -1 : Node[s2].next; //所有结点都需要进行保留,则s2链表为空,令s1=-1,否则返回s2->next
}
int main(){
int begin,n;
cin>>begin>>n;
int id,val,next;
for (int i=0;i<n;i++){
cin>>id>>val>>next;
Node[id].val=val,Node[id].next=next;
}
for (int i=begin;i != -1;i=Node[i].next){
int index=abs(Node[i].val); //index当前结点值的绝对值
hashTable[index]++; //出现的次数++
if (hashTable[index] > 1)
Node[i].flag=true; //之前已经有绝对值相等的结点,则需要将该结点插入到s2中,标记flag=false
else Node[i].flag=false;
}
int s1,s2;
deduplication(begin,s1,s2);
for (int i=s1;i != -1;i=Node[i].next){ //遍历链表s1
if (Node[i].next != -1){
printf("%05d %d %05d\n",i,Node[i].val,Node[i].next);
}else
printf("%05d %d -1\n",i,Node[i].val);
}
for (int i=s2;i != -1;i=Node[i].next){ //遍历链表s2
if (Node[i].next != -1){
printf("%05d %d %05d\n",i,Node[i].val,Node[i].next);
}else
printf("%05d %d -1\n",i,Node[i].val);
}
return 0;
}
PAT 1097 Deduplication on a Linked List (25 分)
最新推荐文章于 2024-07-12 18:02:43 发布