1075. 链表元素分类(25)

给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而[0, K]区间内的元素都排在大于K的元素前面。但每一类内部元素的顺序是不能改变的。例如:给定链表为 18→7→-4→0→5→-6→10→11→-2,K为10,则输出应该为 -4→-6→-2→7→0→5→10→18→11。

输入格式:

每个输入包含1个测试用例。每个测试用例第1行给出:第1个结点的地址;结点总个数,即正整数N (<= 105);以及正整数K (<=1000)。结点的地址是5位非负整数,NULL地址用-1表示。

接下来有N行,每行格式为:

Address Data Next

其中Address是结点地址;Data是该结点保存的数据,为[-105, 105]区间内的整数;Next是下一结点的地址。题目保证给出的链表不为空。

输出格式:

对每个测试用例,按链表从头到尾的顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。

输入样例:
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
输出样例:
 
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>
using namespace std;

class LinkNode
{
public:
	int Data;		//结点数据与下一地址
	int Next;

};

int main()
{
	int firadress,n,k;		//首结点地址,结点数量,限定k值
	cin>>firadress>>n>>k;

	LinkNode linklist[100000];	//结点的下标为当前结点的地址

	vector<int>v[3];

	int i;
	for(i=0;i<n;i++)
	{
		int now_address,data,next_address;		//当前结点地址,数据,下一结点地址
		cin>>now_address>>data,next>>ext_address;

		linklist[temp1].Data = data;
		linklist[temp1].Next = next_address;
	}

	int temp = firadress;		//首结点地址
	while(temp!=-1)
	{
		if( linklist[temp].Data<0 )
			v[0].push_back(temp);                   //应当存储结点的地址,而不是数据和下一地址,只有存储当前地址才能遍历
		else if( linklist[temp].Data>=0 && linklist[temp].Data<=k	 )
			v[1].push_back(temp);
		else if (linklist[temp].Data>k)
			v[2].push_back(temp);

		temp = linklist[temp].Next;		//遍历结点
	}
	
	vector<int>::iterator it;
	int sign =1;

	for(i=0;i<3;i++)	//遍历三个向量
		for(it=v[i].begin();it!=v[i].end();it++)
		{
			if(sign)	//第一个结点只输出 当前地址 与 数据
			{printf("%05d %d ",*it,linklist[*it].Data);sign=0;}
			else
			{			//其后结点 输出两次 当前地址 与数据
				printf("%05d",*it);
				cout<<endl;
				printf("%05d %d ",*it,linklist[*it].Data);
			}
		}
		cout<<"-1"<<endl;	//最后输出尾结点

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值