1. 程式人生 > >實現就地逆置單鏈表

實現就地逆置單鏈表

/////////////////////////////////////////
//
//   就地逆置單鏈表
//
//////////////////////////////////////////
///////////////////

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

// 定義單鏈表的結點
typedef struct Node
{
	int elem ;
	struct Node * next ;
} Node ;

// 定義單鏈表的型別
typedef struct LinkList
{
	Node * head ;
} LinkList ;

// 初始化單鏈表
void Init( LinkList * L )
{
	L->head = (Node*)malloc(sizeof(Node)) ;
	if( !L->head)
	{
		printf("申請記憶體失敗!") ;
		exit(0) ;
	}
	L->head->next = NULL ;
}

// 插入元素
void Insert( LinkList * L , int elem )
{
	Node * p = L->head ;
	while( p->next != NULL )
	{
		p = p->next ;
	}

	Node * node = (Node*)malloc(sizeof(Node)) ;
	if( !node )
	{
		printf("申請記憶體失敗!") ;
		exit(0) ;
	}
	node->elem = elem ;
	node->next = NULL ;

	p->next = node ;
}


// 交換兩個結點的值
void Swap( Node * node1 , Node * node2 )
{
	int tmp = node1->elem ;
	node1->elem = node2->elem ;
	node2->elem = tmp ;
}

// 就地逆置一個單鏈表
void Reverse( LinkList * L )
{
	int length = 0 ;
	Node * p = L->head->next ;
	while( p != NULL )
	{
		p = p->next ;
		length++ ;
	}

	p = L->head ;
	Node * q = L->head;
	for( int i = 0 ; i < length / 2 ; i++ )
	{
		p = p->next ;
		for( int j = 0 ; j < length - i  ; j++ )
		{
			q = q->next ;
		}
	}

    Swap( p , q ) ;
}

// 輸出單鏈表中的元素
void Print( LinkList * L )
{
	Node * p = L->head->next ;
	while( p != NULL )
	{
		printf("%d " , p->elem ) ;
		p = p->next ;
	}
}

// 測試
int main()
{
	LinkList L ;

	Init( &L ) ;

	Insert( &L , 7 ) ;
	Insert( &L , 4 ) ;
	Insert( &L , 8 ) ;

	Print( &L ) ;
	printf("\n") ;

	Reverse( &L ) ;

	Print( &L ) ;
	pritnf("\n") ;

    return 0 ;
}