[转]单链表反转问题

[转]单链表反转问题
原文: http://nkshili.spaces.live.com/blog/cns!BB418D20B454CBE7!1489.entry

/*
两种方法,一种是直接把每个位置都倒转,最后头节点指向本来是尾巴的节点,另一个是每次拿到一个节点都插入到头节点后。
*/

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

//结点类型定义
typedef struct Node
{
    int number;        //数据域
    struct Node *next; //指针域
}*PtrNode

//第一个方法:

void reverse_link_1(PtrNode link)
{
PtrNode first,second,ptr;
if(link->next==NULL)
{
return;
}
ptr=link->next;
first=ptr->next;
ptr->next=NULL;
while(ptr!=NULL)
{
if(first==NULL)
{
link->next=ptr;
break;
}
else
{
second=first->next;
first->next=ptr;
ptr=first;
first=second;
}
}
}

//第二个方法:

void reverse_link_2(PtrNode link)
{
PtrNode ptr,temp;
if(link->next==NULL)
{
return;
}
ptr=link->next;
while(ptr->next!=NULL)
{
temp=ptr->next;
ptr->next=ptr->next->next;
temp->next=link->next;
link->next=temp;
}
}

void  fill_link(PtrNode link)
{
PtrNode ptr,temp;
int  i;
ptr = link;
for (i = 0 ;i < 10 ;i ++ )
{
temp = (PtrNode)malloc( sizeof ( struct  Node));
temp -> number = i;
temp -> next = NULL;
ptr -> next = temp;
ptr = ptr -> next;
}
}

void  print_link(PtrNode link)
{
PtrNode ptr = link -> next;
printf( " Link:\n " );
while (ptr != NULL)
{
printf( " %d\t " ,ptr -> number);
ptr = ptr -> next;
}
printf( " \n " );
}

void  free_link(PtrNode link)
{
PtrNode ptr = link;
while (ptr -> next != NULL)
{
PtrNode temp = ptr -> next;
ptr -> next = temp -> next;
free(temp);
}
}

int  main()
{
PtrNode head;
head = (PtrNode)malloc( sizeof ( struct  Node));
head -> next = NULL;
head -> number =- 1 ;
fill_link(head);
print_link(head);
reverse_link_1(head);
print_link(head);
reverse_link_2(head);
print_link(head);
free_link(head);
print_link(head);
free(head);
system("PAUSE");
return   0 ;
}
运行结果:
[转]单链表反转问题_第1张图片

你可能感兴趣的:([转]单链表反转问题)