任务描述
本关任务:给定一个单链表,把所有的奇数结点和偶数结点分别排在一起,重新链成一个新链表。请注意,这里的奇数结点和偶数结点指的是结点编号的奇偶性,而不是结点的值的奇偶性。
要求:空间复杂度应为 O(1),时间复杂度应为 O(n),n 为链表结点总数。
编程要求
输入
多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔)。当n=0时输入结束。
输出
奇数结点和偶数结点分割后重新链成的新链表。
测试说明
平台会对你编写的代码进行测试:
#include<iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n)
{//后插法创建单链表
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void Decollate(LinkList L,LinkList L1)
{//奇偶链表的分割
/**************begin************/
LinkList p=L->next; //初始化p指向L的首元结点
LinkList q=L; //初始化q指向L的头结点
LinkList p1=L1; //初始化p1指向新链表L1的头结点
int num=1;
while(p)
{
if(num%2!=0) //如果是奇数结点,将其链入新链表L1
{
p1->next=p;
p1=p1->next;
q->next=p->next;
p->next=NULL;
p=q->next;
}
else
{
q=q->next;
p=p->next;
}
num++; //结点序号加1
}
p1->next=L->next; //将剩余链表部分链入新链表的表尾
delete L; //删除原链表的头结点
/**************end************/
}
void PrintList(LinkList &L)
{//依次输出链表中的数据
LinkList p=L->next;
while(p)
{
if(p->next!=NULL) cout<<p->data<<" ";
else cout<<p->data;
p=p->next;
}
cout<<endl;
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
LinkList L=new LNode;
CreateList_R(L,n);
LinkList L1=new LNode; //申请新链表L1
L1->next=NULL;
Decollate(L,L1); //奇偶链表的分割
PrintList(L1);
}
return 0;
}