数据结构单链表的题目 希望有高人帮忙解答 谢谢!
为了提高效率,最后采用了下面的算法。
思路如下:
1.首先将单链表调整为前半部分为奇数,后半部分为偶数的序列;
2.扫描链表,找到分界,拆分成两个子链表;
3.对奇偶子链表排序;
其中第一步算法:
从头开始扫描,p指像当前节点,q指向后继;
1.若p->data为奇数,则继续后移;
2.若p->data为偶数,
(1)当q->data为偶数时,q指针后移,P不变,直到找到一个奇数为止,此时Q节点为找到奇数节点;这时,可交换P和Q节点的Data域,p和Q均后移一步;
(2)当q->data为奇数时,q指针后移,P不变,直到找到一个偶数数为止,此时Q节点为找到偶数的前驱节点;这时,可交换P和Q节点(偶数的前驱节点)的Data域,p指向Q,Q后移;
下面为程序代码:(采用无头节点链表)
void AdjustList(LinkList &L){
//把单链表调整为前半部分为奇数,后半部分为偶数的单链表的调整函数。
LinkList p,q;
int temp;
p=L->next;
q=p->next;
while(q){
if(p->data%2==1)
{
p=q;
q=q->next;
}
else{
temp=q->data%2;
switch(temp)
{
case 0:
while(q&&q->data%2==0)
q=q->next;
if(q){
Swap(p->data,q->data);
p=p->next;
q=q->next;
}
break;
case 1:
while(q&&(q->data%2==1)&&(q->next)
&&((q->next)->data)%2!=0)
q=q->next;
if(q){
Swap(p->data,q->data);
p=q;
q=q->next;
}
break;
default: ;
}
}
}
printf("\n Out the Adjust whole List:");
Print_L(L);
}
void SpiltList(LinkList &L,LinkList &L1,LinkList &L2){
//找到奇数序列与偶数序列的分界,直接拆分的函数;
LinkList p,q;
p=L;
q=p->next;
while(q&&q->data%2!=0){
p=q;
q=q->next;
}
L2=p->next;
p->next=NULL;
L1=L;
}
void Sort(LinkList &L){
//对链表排序;
LinkList p,q,min;
for(p=L;p->next!=NULL;p=p->next){
min=p;
for(q=p->next;q!=NULL;q=q->next)
if(q->data<min->data)
min=q;
Swap(p->data,min->data);
}
}
我这有完整运行程序,只给你关键的模块,对于你的问题,这三个函数足够了,希望你能得到你想要的东西,ok!