链表【5】

目录

删除链表重复元素(保留第一个)

 链表中位数


删除链表重复元素(保留第一个)

注意分类讨论

如果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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值