1133 Splitting A Linked List

1133 Splitting A Linked List
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
两种思路。
参考代码:
方法一:

#include<iostream>
#include<vector>
#include<map>
using namespace std;
struct node {
	int address, data, next;
}node1;
int main()
{
	int begin, n, k, begin1 = -1, begin2 = -1, begin3 = -1, temp,end;
	int end1 = -1, end2 = -1, end3 = -1;
	map<int, node>m;
	scanf_s("%d%d%d", &begin, &n, &k);
	for (int i = 0; i < n; i++) {
		scanf_s("%d%d%d", &node1.address, &node1.data, &node1.next);
		m[node1.address] = node1;
	}
	while (begin != -1) {
		temp = begin;
		begin = m[begin].next;
		if (m[temp].data < 0) {
			if (begin1 == -1)
				begin1 = end1 = temp;
			else {
				m[end1].next = m[temp].address;
				end1 = temp;
			}
		}
		else if (m[temp].data >= 0 && m[temp].data <= k) {
			if (begin2 == -1)
				begin2 = end2 = temp;
			else {
				m[end2].next = m[temp].address;
				end2 = temp;
			}
		}
		else {
			if (begin3 == -1)
				begin3 = end3 = temp;
			else {
				m[end3].next = m[temp].address;
				end3 = temp;
			}
		}
	}
	if (begin1 != -1)
	{
		begin = begin1;
		end = end1;
	    if(begin2 != -1)
		 {
			 m[end].next = m[begin2].address;
			 end = end2;
			 if (begin3 != -1)
			 {
				 m[end].next = m[begin3].address;
				 end = end3;
			 }

		}
		else if (begin3 != -1) {
			m[end].next = m[begin3].address;
			end = end3;
		 }
	}
	else if (begin2 != -1) {
		begin = begin2;
		end = end2;
		if (begin3 != -1)
		{
			m[end].next = m[begin3].address;
			end = end3;
		}
	
	else { begin = begin3; end = end3; }
	m[end].next = -1;
	while (begin != -1)
	{
		printf("%05d %d ", m[begin].address, m[begin].data);
		if (m[begin].next != -1)
			printf("%05d", m[begin].next);
		else printf("-1");
		printf("\n");
		begin = m[begin].next;
	}

	return 0;
}

方法二:

#include<iostream>
#include<vector>
#include<map>
using namespace std;
struct node {
	int address, data, next;
}node1;
int main()
{
	freopen("1133.txt", "r", stdin);
	int begin, n, k, temp;
	vector<node>link, ans;
	map<int, node>m;
	scanf_s("%d%d%d", &begin, &n, &k);
	for (int i = 0; i < n; i++) {
		scanf_s("%d%d%d", &node1.address, &node1.data, &node1.next);
		m[node1.address] = node1;
	}
	temp = begin;
	while (temp!=-1){
		link.push_back(m[temp]);
		temp = m[temp].next;
	}
	for (auto it = link.begin(); it != link.end(); it++)
		if (it->data < 0)
			ans.push_back(*it);
	for (auto it = link.begin(); it != link.end(); it++)
		if (it->data >= 0 && it->data <= k)
			ans.push_back(*it);
	for (auto it = link.begin(); it != link.end(); it++)
		if (it->data > k)
			ans.push_back(*it);
	for (int i = 0; i < ans.size() - 1; i++)
		printf("%05d %d %05d\n", ans[i].address, ans[i].data, ans[i + 1].address);
	printf("%05d %d -1", ans[ans.size()- 1].address, ans[ans.size() - 1].data);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值