给出一个头结点让单链表逆序

1.思路:

给出一个头结点让单链表逆序_第1张图片

思路:(如上图)                                                                                                                                      

1.首先把链表分成两部分:头结点Head和头节点下一个结点Current作为一组A,剩下的作为另一组B。把Current指向NULL,断开链表。

2.把B组的结点1,2,3........,依次插入到Head和Current之间。

3.最后把Head指回最后插入的结点就完成了。


思路实现函数:

Node* fun(Node* Head)
{
	Node *Pn;
	Node *Pre;
	Node *Current = Head->next;
	Pn = Current->next;
	Current->next=NULL;
	while(Pn!=NULL)
	{
		Pre=Pn->next;
		Pn->next=Current;
		Current=Pn;
		Pn=Pre;
	}
	Head->next=Current;
	return Head;
}


测试代码:

#include 
typedef struct A
{
	int a;
	struct A *next;
}Node;

Node* fun(Node* Head)
{
	Node *Pn;
	Node *Pre;
	Node *Current = Head->next;
	Pn = Current->next;
	Current->next=NULL;
	while(Pn!=NULL)
	{
		Pre=Pn->next;
		Pn->next=Current;
		Current=Pn;
		Pn=Pre;
	}
	Head->next=Current;
	return Head;
}


int main()
{ 
	/*构造链表,int a分别为0,1,2,3,4*/ 
	Node arr[5];
	Node head;
	Node *Head;
	Node *pn;
	Head = &head;
	pn = Head;
	int i;
	for(i=0;i<5;i++)
		arr[i].a=i;
	Head->next=&arr[0];
	for(i=0;i<4;i++)
	{
		arr[i].next=&arr[i+1];
	}
	arr[4].next=NULL;
	pn=Head->next;
	/*打印原链表*/ 
	while(pn!=NULL)
	{
		printf("%d,",pn->a);
		pn=pn->next;
	}
	printf("\n");
	/*-----------------------逆序后--------------------------------*/
	Head = fun(Head);
	pn=Head->next;
	while(pn!=NULL)
	{
		printf("%d,",pn->a);
		pn=pn->next;
	}
	return 0;
}


你可能感兴趣的:(#,数据结构)