您的位置:首页 > 其它

链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g

2012-09-27 11:50 337 查看
链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g 
struct DNode
{
DNode *pre;
DNode *next;
int data;
};
typedef DNode* DNodeTree;

//////////////////////////////////////////////////////////////////////////
//交换临近节点
DNode *Exchange1(DNode *head,DNodeTree &p1,DNodeTree &p2) //假定p1在前,p2在后,
{
// 	DNode *p1_pre,*p1_next,*p2_pre,*p2_next;
// 	p1_pre=p1->pre;
// 	p1_next=p1->next;
// 	p2_pre=p2->pre;
// 	p2_next=p2->next;
//
// 	p1_pre->next=p2;
// 	p1_next->pre=p2;
// 	p2_pre->next=p1;
// 	p2_next->pre=p1;
//
// 	p1->next=p2_next;
// 	p1->pre=p2_pre;
//
// 	p2->next=p1_next;
// 	p2->pre=p1_pre;zai//
//这里只根据题中的要求,所以没有考虑当节点不相邻的情况
if (p2->next==NULL)
{
p2->pre=p1->pre;
p1->next=p2->next;

p1->pre->next=p2;
p2->next=p1;
p1->pre=p2;
}
else
{
p1->next=p2->next;
p2->pre=p1->pre;

p1->pre->next=p2;
p2->next->pre=p1;
p2->next=p1;
p1->pre=p2;

}
p1=p2; //交换位置
p2=p1->next;
return head;
}
DNode *Exchange_Near_Node(DNode *head)
{
DNode *p,*p1,*p2;
p1=head;
p2=head;
p=head->next;
int temp=0;
while(p) //从头结点的下一个计算,头结点不算一个节点
{
temp++;
p=p->next;
}
p1=p1->next;
p2=p2->next->next;
if(temp%2!=0) //节点个数为奇数
{
while ((temp=temp/2)!=0)
{
head=Exchange1(head,p1,p2);
p1=p1->next->next;   //每次交换后,向后推进两个
p2=p2->next->next;
}

}
else//节点个数为偶数	{
do{
head=Exchange1(head,p1,p2);
if (p2->next==NULL)
{
break;
}
p1=p1->next->next;
p2=p2->next->next;
}while ((temp=temp/2)!=0);

}

return head;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  exchange p2p null