鏈表相鄰元素翻轉,如a->b->c->d->e->f-g,翻轉後變爲:b->a->d->c->f->e->g

鏈表相鄰元素翻轉,如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;


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章