单链表的逆序

Posted on 2016-05-31 15:52  洪爵士  阅读(181)  评论(0编辑  收藏  举报
#include <stdio.h>
#include <stdlib.h>
//单链表的逆序使用三个辅助指针
typedef struct Node
{
	int data;
	struct Node *next;
}Node;
//从尾部添加节点
void AppendtoEnd(Node *head, int data)
{
	Node *new_node=NULL;
	Node *temp=NULL;

	new_node=malloc(sizeof(Node));
	new_node->data=data;
	new_node->next=NULL;

	//找到最后一个节点
	temp=head;
	for(;temp->next!=NULL;temp=temp->next);
	temp->next=new_node;
}

//打印链表
void ShowList(Node *head)
{
	Node* temp=NULL;
	if(head==NULL)
	{
		return ;
	}
	temp=head->next;
	for(;temp!=NULL;temp=temp->next) 
	{
		printf("%d",temp->data);
		printf("-->");
	}
	printf("\n");

}

//单链表的逆序
Node* ReverseList(Node *head)
{
	Node* frist=NULL;
	Node* second=NULL;
	Node* third=NULL;
	if(head==NULL||head->next==NULL)
	{
		return head;
	}
	frist=head->next;
	second=frist->next;
	third=second->next;
	frist->next=NULL;
	while(third!=NULL)
	{
		second->next=frist;

		frist=second;
		second=third;
		third=third->next;
	}
	second->next=frist;
	head->next=second;
	return head;
}

int main()
{
	int i=0;
	Node *head=malloc(sizeof(Node));
	Node *newhead=NULL;
	head->next=NULL;
	for(i=1;i<11;i++) 
	{
		AppendtoEnd(head, i);
	}
	ShowList(head);
	newhead=ReverseList(head);
	ShowList(newhead);
	free(head);
	return 0;
}