/
//
// 就地逆置单链表
//
//
///
#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 ;
}
实现就地逆置单链表
最新推荐文章于 2023-10-13 20:30:00 发布