7-2 Reversing Linked List (25分)*

本文介绍如何对链表进行按地址排序,并反转前k个节点的操作。通过输入节点地址和数据,实现链表重构与特定节点反转,输出节点间关系清晰的地址数据结构。

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

把链表按地址排序,再反转k个节点

const int N = 100005;

struct st {
	int add, data, next;
}a[N], *b[N];

int main() {
	int head, n, k;
	cin >> head >> n >> k;
	for(int i = 0; i < n; i ++) {
		int address, data, next;
		cin >> address >> data >> next;
		a[address].add = address;
		a[address].data = data;
		a[address].next = next;
	}
	int j = 0;
	for(int i = head; i != -1; i = a[i].next) { //排序 
		b[j] = &a[i];
		j ++;
	}
	
	reverse(b, b + k); //反转  
	
	for(int i = 0; i < j; i ++) {
		if(i != j - 1) {
			printf("%05d %d %05d\n", b[i] -> add, b[i] -> data, b[i + 1] -> add);
		}
		else {
			printf("%05d %d -1\n", b[i] -> add, b[i] -> data);
		}
	}
	return 0;
}

注意的点:
输入时要将每个节点放在它对应地址的下标上,也就是 数组下标要等于节点地址,便于排序时按照下标索引出来
输出时要排除不在链表中的点,排序时已经得到链表中有j个有效点,就要输出j个,因为输入的n个点有可能没有连在链表中
输出格式,输出本节点的地址,本节点的数字,下一节点的地址作为本节点的下一节点地址;如遇最后一个节点,下一节点地址要改为-1

在这里插入图片描述

不明白提示。。反转代码有问题,修改为:

    for (i = 0; i <= j - k; i += k) { //反转,<= 假设有k = j = 4,也应该翻转一次。
        reverse(b + i, b + i + k);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值