hunter学算法-链表的反转

题目:把一个单链表反转

C语言解题

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
	struct Node *next;
	int data;
}Node,LinkedList;

/**
 *链表的初始化
 */
LinkedList* init()
{
	Node* list = NULL;
	Node* currentNode = list;

	int i;
	for(i = 0; i < 5; i ++)
	{
		Node * node = (Node*)malloc(sizeof(Node*));
		if(node == NULL)
		{
			break;
		}
		node->data = i;
		node->next = NULL;
		if(currentNode != NULL)
		{
			currentNode->next = node;
			currentNode = node;
		}
		else
		{
			list = node;
			currentNode = list;
		}
	}
	return list;
}

/**
 * 链表的遍历
 */
void Traversal(LinkedList *list)
{
	Node *p = list;
	while(p!= NULL)
	{
		printf("%d",p->data);
		p = p->next;
	}
	printf("\n");
}

/**
 * 链表的反转
 */
LinkedList* ReversalList(LinkedList *list)
{
	Node *p1,*p2,*p3;
	p1 = list;
	p2 = p1->next;
	p3 = p2->next;

	p1->next = NULL;//第一个值需要特别处理为NULL
	while(p2 != NULL)//需要考虑边界值的判定
	{
		p2->next = p1;//最重要的反转处理

		//对于这三个指针,需要整体后移,以处理后面的情况
		p1 = p2;
		p2 = p3;
		if(p3 != NULL)//需要注意边界值的处理
		{
			p3 = p3->next;
		}
	}

	return p1;//经过最后一次的后移,其实p1已经处于最后一个元素
}

int main(void)
{

	LinkedList *list = init();
	Traversal(list);
	list = ReversalList(list);
	Traversal(list);
	return EXIT_SUCCESS;
}




你可能感兴趣的:(hunter学算法-链表的反转)