PAT A1133 2019.08.18 【静态链表】

1133 Splitting A Linked List (25 分)

Given a singly linked list, you are supposed to rearrange its elements so that all the negative values appear before all of the non-negatives, and all the values in [0, K] appear before all those greater than K. The order of the elements inside each class must not be changed. For example, given the list being 18→7→-4→0→5→-6→10→11→-2 and K being 10, you must output -4→-6→-2→7→0→5→10→18→11.

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 (≤10​5​​) which is the total number of nodes, and a positive K (≤10​3​​). 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 in [−10​5​​,10​5​​], and Next is the position of the next node. It is guaranteed that the list is not empty.

Output Specification:

For each case, output in order (from beginning to the end of the list) the resulting linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 9 10
23333 10 27777
00000 0 99999
00100 18 12309
68237 -6 23333
33218 -4 00000
48652 -2 -1
99999 5 68237
27777 11 48652
12309 7 33218

Sample Output:

33218 -4 68237
68237 -6 48652
48652 -2 12309
12309 7 00000
00000 0 99999
99999 5 23333
23333 10 00100
00100 18 27777
27777 11 -1

思路分析

静态链表的操作

首先将输入数据还原为初始链表

之后遍历三回,第一回找<0 第二回[0,k] 第三回>k 的结点即可,依次将这些结点的地址入栈

之后从栈底输出至栈顶即可

本题要用两个map

无奈的时是倒数第二个测试点没有过,暂时无法想出解决方案

#include<cstdio>
#include<iostream>
#define MAX 100010
using namespace std;

typedef struct NODE{
	int data;
	int fadd,ladd;
}NODE;

NODE temp[MAX];
NODE former[MAX];
int dataMap[MAX];//preserve data   map[23333] = 10;  fadd--data
int addMap[MAX];//fadd--ladd
int stack[MAX];
int top=-1;



int main()
{
	int firstAdd,n,k;
	scanf("%d %d %d",&firstAdd,&n,&k);
	
	int begin;
	for(int i=0;i<n;i++)
	{
		scanf("%d",&temp[i].fadd);
		scanf("%d",&temp[i].data);
		scanf("%d",&temp[i].ladd);
		dataMap[temp[i].fadd]=temp[i].data;
		addMap[temp[i].fadd]=temp[i].ladd;
		if(temp[i].fadd == firstAdd)begin=i;
	}
//	printf("begin:%d\n",begin);
	
	former[0].data=temp[begin].data;
	former[0].fadd=temp[begin].fadd;
	former[0].ladd=temp[begin].ladd;
	int nextAdd = former[0].ladd;
	for(int i=1;i<n;i++)
	{
		former[i].fadd=nextAdd;
		former[i].data=dataMap[nextAdd];
		former[i].ladd=addMap[nextAdd];
		nextAdd = former[i].ladd;
	}
	
	for(int i=0;i<n;i++)
	{
//		printf("%05d ",former[i].fadd);
//		printf("%d ",former[i].data);
//		printf("%05d\n",former[i].ladd);
		if(former[i].data<0)
		  stack[++top]=former[i].fadd;
	}
//	printf("1----\n\n");
	
	for(int i=0;i<n;i++)
	{
		if(0<=former[i].data&&former[i].data<=k)
		  stack[++top]=former[i].fadd;
	}
	for(int i=0;i<n;i++)
	{
		if(former[i].data>k)
		  stack[++top]=former[i].fadd;
	}
	
	//relink need modify ldd
//	printf("2------\n\n\n");
	for(int i=0;i<=top;i++)
	{
		printf("%05d ",stack[i]);
		printf("%d ",dataMap[stack[i]]);
		if(i!=top)
		printf("%05d\n",stack[i+1]);
		else printf("-1\n");
	}
	
	
	

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值