#include <iostream>
using namespace std;

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;

void InitList(LinkList &L)
{
	L=new LNode;
	L->next=NULL;
	return; 
}

void CreateList_R(LinkList &L,int n)
{
	int i; 
	LinkList r=L;
	LinkList p; 
	
	for(i=0;i<n;i++)
	{
		p=new LNode;
		int data;
		cin>>data;
		p->data=data;
		p->next=NULL;
		r->next=p;
		r=p; 
	}
	return;
}

void Show(LinkList &L)
{
	LinkList p=L->next;
	while(p){
		cout<<p->data;
		if(p->next) cout<<" ";
		p=p->next;
	}
	cout<<endl;
	return;
}

void Diss(LinkList &A)
{ 
	LinkList B;
	InitList(B);
	LinkList C;
	InitList(C);
	LinkList pa=A,pb=B,pc=C;pa=A->next;
	while(pa)
	{
		if(pa->data < 0)
		{
			pb->next=pa;
			pb=pa;	
			pa=pa->next;
			pb->next=NULL;
		}
		else//不能缺少else 
		if(pa->data > 0)
		{
			pc->next=pa;
			pc=pa;	
			pa=pa->next;
			pc->next=NULL;
		}
	} 
	Show(B);
	Show(C);
	return;
	
}



int main()
{
	int n;
	cin>>n;
	while(n!=0)
	{
		LinkList A;
		InitList(A);
		CreateList_R(A,n);
		//Show(A);
		Diss(A);
		cin>>n;//key
	}
	return 0;
}

描述

 

利用单链表A表示一个非零整数序列,把A分解为两个具有相同结构的链表B和C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点。要求空间复杂度为O(1),链表B和C均利用链表A的结点空间。

输入

多组数据,每组数据有两行,第一行为链表A的长度n,第二行为链表A的n个元素(元素之间用空格分隔)。当n=0时输入结束。

输出

对于每组数据分别输出两行,分别对应链表B和C的元素,每个数据之间用空格分隔。

输入样例 1 

7
3 -6 1 -2 4 -3 8
8
2 5 3 -1 -2 2 6 -1
0

输出样例 1

-6 -2 -3
3 1 4 8
-1 -2 -1
2 5 3 2 6
posted on 2020-02-17 13:11  海月CSDN  阅读(205)  评论(0编辑  收藏  举报