pat1097链表去重
与之前不同的是,需要把删掉的元素也拍成一个链表
分类讨论你就好好的分
如果重复了——pre不动,pre的next指向cur的next,然后在已删除中加上一个节点,状态移至下个节点(最后完了记得加上-1)
如果没重复——附1,pre=cur,cur=next
#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
const int N=100005;
int n,first,firstid;
using namespace std;
int head,k;
int lnxt[N];
int val[N];
void readout()
{ int temp=head;
while(temp!=-1)
{printf("%d %d %d\n",temp,val[temp],lnxt[temp] );temp=lnxt[temp] ;
}
}
int main()
{
scanf("%d %d",&head,&n);
for(int i=0;i<n;i++)
{
int idtemp;
int valt,lnxtt;
scanf("%d %d %d",&idtemp,&valt,&lnxtt);
val[idtemp]=valt;lnxt[idtemp]=lnxtt;
}
int cur=head,pre=-1;
bool h[N]={0};
int dm=N-1;int c=dm;
while(cur!=-1)
{
if(h[abs(val[cur])])
{
lnxt[pre]=lnxt[cur];//删除
lnxt[c]=cur;
c=cur;
// pre=cur;
cur=lnxt[cur];
}
else{
h[abs(val[cur])]=1;
pre=cur;
cur=lnxt[cur];
}
}
lnxt[c]=-1;
int tp1=head,tp2=lnxt[dm];
//printf("%d %d\n",tp2,dm);
while(tp1!=-1)
printf(lnxt[tp1]>=0?"%05d %d %05d\n":"%05d %d %d\n",tp1,val[tp1],lnxt[tp1]),tp1=lnxt[tp1];
while(tp2!=-1 )
printf(lnxt[tp2]>=0?"%05d %d %05d\n":"%05d %d %d\n",tp2,val[tp2],lnxt[tp2]),tp2=lnxt[tp2];
}
pat1133链表元素分类
评级:简单????????
这里我想,在原链表上搞有点麻烦?想试试开个新链表
确实可以,下一个节点坐标我们新开个lnxt2数组单独记录
三个条件,遍历三次
#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
const int N=100005;
int n,first,firstid;
using namespace std;
int head,k;
int lnxt[N];
int val[N];
void readout()
{ int temp=head;
while(temp!=-1)
{printf("%d %d %d\n",temp,val[temp],lnxt[temp] );temp=lnxt[temp] ;
}
}
int main()
{
scanf("%d %d %d",&head,&n,&k);
for(int i=0;i<n;i++)
{
int idtemp;
int valt,lnxtt;
scanf("%d %d %d",&idtemp,&valt,&lnxtt);
val[idtemp]=valt;lnxt[idtemp]=lnxtt;
}
int cur=head,pre=-1;
bool h[N]={0};
int dm=N-1;int c=dm;
int lnxt2[N];
while(cur!=-1)
{
if(val[cur]<0)
{lnxt2[c]=cur;c=cur;lnxt2[c]=-1;
}
cur=lnxt[cur];
}
cur=head;
while(cur!=-1)
{
if(val[cur]>=0 && val[cur]<=k)
{lnxt2[c]=cur;c=cur;lnxt2[c]=-1;
}
cur=lnxt[cur];
}
cur=head;
while(cur!=-1)
{
if(val[cur]>k)
{lnxt2[c]=cur;c=cur;lnxt2[c]=-1;
}
cur=lnxt[cur];
}
int tp2=lnxt2[dm];
//printf("%d %d\n",tp2,dm);
while(tp2!=-1 )
printf(lnxt2[tp2]>=0?"%05d %d %05d\n":"%05d %d %d\n",tp2,val[tp2],lnxt2[tp2]),tp2=lnxt2[tp2];
}
链表就先告一段落啦~