拆分单链表
前言
用于个人学习过程记录
题目
输入若干个绝对值不超过100的整数,建立单链表A,设计算法将单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A的元素类型为整型,要求B、C表利用A表的结点,不另外占用其它的存储空间,若采用带头结点的单链表实现则允许再申请一个头结点)。然后分两行按原数据顺序输出链表B和C。测试数据保证每个结果链表至少存在一个元素。
输入格式:
首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据在一行上输入数据个数n及n个不含整数0且绝对值不超过100的整数。
输出格式:
对于每组测试,分两行按原数据顺序输出链表B和C,每行的每两个数据之间留一个空格。
输入样例:
1
10 49 53 -26 79 -69 -69 18 -96 -11 68
输出样例:
-26 -69 -69 -96 -11
49 53 79 18 68
代码
#include<iostream>
using namespace std;
struct LNode{
int data;
LNode *next;
};
struct LinkList{
LNode *head;
void Init();
void Create(int n);
void Traveser();
};
void LinkList::Init(){
head = new LNode;
head->next=NULL;
}
void LinkList::Create(int n){
Init();
LNode *p = head;
while(n--){
LNode *q= new LNode;
cin>>q->data;
q->next=p->next;
p->next=q;
p=q;
}
}
void LinkList::Traveser(){
LNode *p=head->next;
while(p){
if(p!=head->next) cout<<" ";
cout<<p->data;
p=p->next;
}
cout<<endl;
}
void List(LinkList &a,LinkList &b,LinkList &c){
b.head = new LNode;
b.head->next=NULL;
c.head = new LNode;
c.head->next=NULL;
LNode *pb = b.head;
LNode *pc = c.head;
for(LNode *pa =a.head->next;pa!=NULL;pa=pa->next){
if(pa->data < 0){
pb->next=pa;
pb=pa;
}
else{
pc->next=pa;
pc=pa;
}
}
pb->next=NULL;
pc->next=NULL;
}
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
LinkList a,b,c;
a.Create(n);
List(a,b,c);
b.Traveser();
c.Traveser();
}
}