天天看點

給出一個頭結點讓單連結清單逆序

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 <stdio.h>
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;
}
           

繼續閱讀