02-线性结构3 Reversing Linked List(25 分)

本文介绍了一种算法,用于将单链表中每K个元素进行逆序操作。通过实例展示了输入输出规范,提供了完整的C语言代码实现,包括节点定义、链表初始化、逆序操作及输出结果。

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

02-线性结构3 Reversing Linked List (25 分)

Given a constant KKK and a singly linked list LLL, you are supposed to reverse the links of every KKK elements on LLL. For example, given LLL being 1→2→3→4→5→6, if KKK=3, then you must output 3→2→1→6→5→4; if KKK=4, you must output 4→3→2→1→5→6.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N(≤105)N (≤10^5)N(105) which is the total number of nodes, and a positive K(≤N)K (≤N)K(N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

Then NNN lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer, and Next is the position of the next node.

Output Specification:

For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

Sample Output:

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

#include <stdlib.h>
#include <stdio.h>


typedef struct node {
	int Address;
	int Data;
	int Next;
}list;

void Array(list a[], int N, int headaddress);
void Exchange(list a[], int i, int j);
void Reverse(list a[], int N, int K);

int main(){
	int K, N, headaddress, eff;
	scanf("%d %d %d", &headaddress, &N, &K);
	list a[N];
	for (int i = 0; i<N; i++) {
		scanf("%d %d %d", &a[i].Address, &a[i].Data, &a[i].Next);
	}
	Array(a, N, headaddress);
	for (int i = 0; i<N; i++) {
		if (a[i].Next == -1) {
			eff = i + 1;
		}
	}
	Reverse(a, eff, K);
	for (int i = 0; i<eff; i++)	{
		a[i].Next = a[i + 1].Address;
		if (i == eff - 1) {
			a[i].Next = -1;
		}
	}
	for (int i = 0; i<eff - 1; i++) {
		printf("%05d %d %05d\n", a[i].Address, a[i].Data, a[i].Next);
	}
	printf("%05d %d %d\n", a[eff - 1].Address, a[eff - 1].Data, -1);
	return 0;
}


void Array(list a[], int N, int headaddress) {
	for (int i = 0; i<N; i++) {
		if (a[i].Address == headaddress) {
			Exchange(a, i, 0);
			break;
		}
	}
	for (int i = 0; i<N; i++) {
		for (int j = i + 1; j<N; j++) {
			if (a[i].Next == a[j].Address) {
				Exchange(a, i + 1, j);
				break;
			}
		}
	}
}


void Exchange(list a[], int i, int j) {
	list temp;
	temp.Address = a[j].Address;
	temp.Data = a[j].Data;
	temp.Next = a[j].Next;
	a[j].Address = a[i].Address;
	a[j].Data = a[i].Data;
	a[j].Next = a[i].Next;
	a[i].Address = temp.Address;
	a[i].Data = temp.Data;
	a[i].Next = temp.Next;
}

void Reverse(list a[], int N, int K) {
	int cnt = N / K;
	if (cnt) {
		for (int j = 1; j <= cnt; j++) {
			for (int i = 1; i <= K; i++) {
				if ((j - 1)*K + i - 1 <= j * K - i - 1) {
					Exchange(a, (j - 1)*K + i - 1, j*K - i);
				}
			}
		}
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值