02-线性结构3 Reversing Linked List



Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=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) which is the total number of nodes, and a positive 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 N 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 int Elemetype;

typedef struct  node
{
	Elemetype head;
	Elemetype data;
	Elemetype end;
}Node;

int main()
{
	int start, number, k;
	scanf("%d %d %d", &start, &number, &k);
	Node *a=(Node *)malloc(sizeof(Node)*100000);
	for (int i = 0; i < number; i++)
	{
		int s, d, e;
		scanf("%d %d %d", &s, &d, &e);
		a[s].data = d;
		a[s].end = e;
		a[s].head = 0;
	}
	Node *b = (Node *)malloc(sizeof(Node)*number);
	int i=0;
	int m=start;
	for (m = start; a[m].end != -1; i++) {
		b[i].head = m;
		b[i].data = a[m].data;
		b[i].end = a[m].end;
		m = a[m].end;
	}
	b[i].head = m;
	b[i].data = a[m].data;
	b[i].end = a[m].end;
	int S = 0, E = k;
	while (i >= E-1) {
		
		for (int z = E-1; z >=S; z--)
		{
			if (z != S) {
				printf("%05d %d %05d\n", b[z].head, b[z].data, b[z - 1].head);
			}
			else {
				if (E + k - 1 <= i) {

					printf("%05d %d %05d\n", b[z].head, b[z].data, b[E+k - 1].head);
					
				}
				else {
					if (b[E - 1].end == -1) {
						printf("%05d %d %d\n", b[z].head, b[z].data, b[E - 1].end);
					}
					else {
						printf("%05d %d %05d\n", b[z].head, b[z].data, b[E - 1].end);
					}
				}
			}
		}
		S = E;
		E = E + k;
	}
	int j = S;
	for (; j <i; j++)
	{
		printf("%05d %d %05d\n", b[j].head, b[j].data, b[j].end);
	}
	if (j == i) {
		printf("%05d %d %d\n", b[i].head, b[i].data, b[i].end);
	}
	system("pause");
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_29718605/article/details/80262130