链表的分解
描述
利用单链表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
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define MAXSIZE 1000 #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef struct LNode{ int num; struct LNode *next; }LNode,* LinkList; void Inist_List(LinkList& L){ L=new LNode; L->next=NULL; } void Zuhe(LinkList& L1){ LinkList H1=L1; int m,n; while(1){ scanf("%d",&m); if(m==0) break; for(int i=0;i<m;i++){ LinkList p= new LNode; scanf("%d",&p->num); p->next=NULL; L1->next=p; L1=p; } L1=H1; LinkList p1,p2,M1,M2,q; Inist_List(M1); Inist_List(M2); p1=M1; p2=M2; for(q=L1->next;q!=NULL;){ if(q->num<0){ p1->next=q; q=q->next; p1=p1->next; p1->next=NULL; } else{ p2->next=q; q=q->next; p2=p2->next; p2->next=NULL; } } LinkList b; b=M1; while(b->next->next) { b=b->next; printf("%d ",b->num); } printf("%d\n",b->next->num); LinkList c; c=M2; while(c->next->next) { c=c->next; printf("%d ",c->num); } printf("%d\n",c->next->num); } } int main(){ LinkList L1; Inist_List(L1); Zuhe(L1); return 0; }

浙公网安备 33010602011771号