目录
删除链表重复元素(保留第一个)
注意分类讨论
如果cur和以前的书重复了,则修改pre的next为cur的next,然后cur=next ,但是pre保持不变
如果没有重复,需要将pre改成cur,cur改成next、
#include<stdio.h>
const int N=1005;
int n,first,firstid;
using namespace std;
struct node
{
int data;int next;
} ;
node lnode[N];
void readin()
{
for(int i=0;i<n;i++)
{ int idtemp;scanf("%d",&idtemp);
scanf("%d %d",&lnode[idtemp].data,&lnode[idtemp].next);
}
}
void readout()
{ int temp=firstid;
while(temp!=-1)
{printf("%d %d %d\n",temp,lnode[temp].data,lnode[temp].next );temp=lnode[temp].next ;
}
}
void deletex(int pre)
{
lnode[pre].next=lnode[lnode[pre].next].next;
}
int main()
{
scanf("%d %d",&n,&firstid);int tgt;
// int itern=first;
// scanf("%d",&tgt);
readin();
int pre=-1,cur,next;cur=firstid;
bool h[N]={0};
while(cur!=-1)
{
next=lnode[cur].next;
if(h[lnode[cur].data])
{lnode[pre].next =next;
}
else pre=cur;
h[lnode[cur].data]=1;
cur=next;
}
//printf("ans:\n");
readout();
}
链表中位数
使用快慢指针
自己写的
#include<stdio.h>
const int N=1005;
int n,first,firstid;
using namespace std;
struct node
{
int data;int next;
} ;
node lnode[N];
void readin()
{
for(int i=0;i<n;i++)
{ int idtemp;scanf("%d",&idtemp);
scanf("%d %d",&lnode[idtemp].data,&lnode[idtemp].next);
}
}
//
//void readout()
//{ int temp=firstid;
//while(temp!=-1)
//{printf("%d %d %d\n",temp,lnode[temp].data,lnode[temp].next );temp=lnode[temp].next ;
//}
//}
void deletex(int pre)
{
lnode[pre].next=lnode[lnode[pre].next].next;
}
int main()
{
scanf("%d %d",&n,&firstid);int tgt;
// int itern=first;
// scanf("%d",&tgt);
readin();
int pre_s=-1,cur_s=firstid,next_f;
int pre_f=-1,cur_f=firstid,next_s;
int count=0;
while(cur_f!=-1)
{//printf("%d %d\n",cur_f,cur_s);
next_f=lnode[cur_f].next;pre_f=cur_f;cur_f=next_f;
if((count%2))
{//printf("count%d\n",count);
next_s=lnode[cur_s].next;pre_s=cur_s;cur_s=next_s;
}
count++;
}
//printf("%d",count);
if(!(count%2)) printf("%.1lf",double(lnode[cur_s].data)/2 + double(lnode[pre_s].data )/2);
else printf("%.1lf",double(lnode[cur_s].data));
}
我在使慢指针移动时使用奇偶性判断,在判断数组长度使用奇偶性判断,还是用了pre以防走过了,事实上不用这么麻烦,
移动快指针,写两句就行了
判断是自己是-1 or 自己next是-1,等等价于判断奇偶性
不让走过,就无需pre
不让走过的措施:
如果你写的是 fast!=-1; fast的next!=-1,那么必然会过,所以需要判断超前一个
fast的next的next!=-1; fast的next!=-1
简短的标程
#include <cstdio>
const int MAXN = 100;
struct Node {
int data, next;
} nodes[MAXN];
int main() {
int n, first, id;
scanf("%d%d", &n, &first);
for (int i = 0; i < n; i++) {
scanf("%d", &id);
scanf("%d%d", &nodes[id].data, &nodes[id].next);
}
int fast = first, slow = first;
while (nodes[fast].next != -1 && nodes[nodes[fast].next].next != -1) {
slow = nodes[slow].next;
fast = nodes[fast].next;
fast = nodes[fast].next;
}
if (nodes[fast].next == -1) {
printf("%.1f", (double)nodes[slow].data);
} else {
printf("%.1f", (nodes[slow].data + nodes[nodes[slow].next].data) / 2.0);
}
return 0;
}
其实,就是斗,这个不对,换一个即可
修改后的我的答案
#include<stdio.h>
const int N=1005;
int n,first,firstid;
using namespace std;
struct node
{
int data;int next;
} ;
node lnode[N];
void readin()
{
for(int i=0;i<n;i++)
{ int idtemp;scanf("%d",&idtemp);
scanf("%d %d",&lnode[idtemp].data,&lnode[idtemp].next);
}
}
//
//void readout()
//{ int temp=firstid;
//while(temp!=-1)
//{printf("%d %d %d\n",temp,lnode[temp].data,lnode[temp].next );temp=lnode[temp].next ;
//}
//}
void deletex(int pre)
{
lnode[pre].next=lnode[lnode[pre].next].next;
}
int main()
{
scanf("%d %d",&n,&firstid);int tgt;
// int itern=first;
// scanf("%d",&tgt);
readin();
int cur_s=firstid,next_f;
int cur_f=firstid,next_s;
int count=0;
while(lnode[lnode[cur_f].next].next !=-1 && lnode[cur_f].next != -1)
{//printf("%d %d\n",cur_f,cur_s);
next_f=lnode[cur_f].next; cur_f=next_f;
next_f=lnode[cur_f].next; cur_f=next_f;
//if((count%2))
//{//printf("count%d\n",count);
next_s=lnode[cur_s].next; cur_s=next_s;
//}
count++;
}
//printf("%d",count);
if(lnode[cur_f].next != -1) printf("%.1lf",double(lnode[cur_s].data)/2 + double(lnode[lnode[cur_s].next ].data )/2);
else printf("%.1lf",double(lnode[cur_s].data));
}
插个今天发现的小网站 不迷路https://blog.csdn.net/matlab2020ab/category_11148536.html