1075 链表元素分类

该博客主要介绍了一个程序,用于根据输入的链表节点值将它们分为三类并重构新链表。程序首先读取链表信息,然后通过三次循环提取小于0、小于等于K和其他节点,并构建新的答案链表。最后,程序输出新链表的节点连接关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1075 链表元素分类

在这里插入图片描述

思路:
前面要做的事情是:读取输入,组成原链表

  • 每个链表节点用一个结构体表示,结构体内三个参数,分别是当前节点的地址add、值val,以及是否已经被提取为答案链表ext。
  • 创建两个结构体数组L和ans,分别代表原链表和新链表
  • 创建2个map,对应关系分别是:
    (1)ne:当前地址——下个节点地址
    (2)val:当前地址——值

接下来要做的是从原链表中提取节点组成新链表

  • 用三次for循环分别抽取小于0的节点,小于等于K的节点,以及其他节点加入答案链表。抽取后的节点的ext值设为-1。
#include<stdio.h>
#include<iostream>
#include<map>

using namespace std;

struct node {
	int add;
	int val;
	int ext;
} L[100005], ans[100005];

map<int, int>ne, val;

int main(void) {
	int add, n, k; cin >> add >> n >> k;
	for (int i = 0; i < n; i++) {
		int a, x, b; cin >> a >> x >> b;
		ne[a] = b;
		val[a] = x;
	}
	int index = 0;
	while (1) {
		L[index].add = add;
		L[index].val = val[add];
		index++;
		add = ne[add];
		if (add == -1) { break; }
	}
	n = index;
	index = 0;
	for (int i = 0; i < n; i++) {  // 提取值小于0的节点
		if (L[i].val < 0) {
			ans[index++] = L[i];
			L[i].ext = -1;
		}
	}
	for (int i = 0; i < n; i++) {  // 提取值小于等于K的节点
		if (L[i].val <= k && L[i].ext != -1) {
			ans[index++] = L[i];
			L[i].ext = -1;
		}
	}
	for (int i = 0; i < n; i++) {  // 提取其他节点
		if (L[i].ext != -1) { ans[index++] = L[i]; }
	}

	for (int i = 0; i < n; i++) {  // 输出答案链表
		if (i + 1 != n) {  // 假如不是最后一个链节点
			printf("%05d %d %05d\n", ans[i].add, ans[i].val, ans[i + 1].add);
		}
		else { // 假如是最后一个链节点(没有L[i+1]了)
			printf("%05d %d -1", ans[i].add, ans[i].val);
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值