链表结构的反转(5)

链表结构反转的思想:

    将一个链表分为3部分,head(头部分),mid(中间部分),last(最后部分);

    反转前的顺序:head->mid->last;

    反转后的顺序:last->mid->head;

    因此,将last向head方向移动,head向last方向移动,最终使mid成为head的前结点,last成为mid的前结点。

    llink  inverllist(llink head)
   {
              llink mid,last;
              mid=NULL;                            //mid是head的前结点
              while(head!=NULL)
               {
                      last=mid;                      //last是mid的前结点
                      mid=head;
                      head=head->next;         //下一个结点
                      mid->next=last;            //mid指向前结点last
               }
               return mid;
 }

举例如下,

链表的反转
#include"stdio.h"
#include
"stdlib.h"
struct llist
{
int num;
struct llist *next;
};
typedef
struct llist node;
typedef node
*llink;
/*------------链表的输出----------*/
void printllist( llink ptr)
{
while (ptr!=NULL)
{
printf(
"[%d]",ptr->num);
ptr
=ptr->next;
}
printf(
"\n");
}
/*--------链表的创建--------*/
llink createllist(
int *array ,int len)
{
llink head;
llink ptr,ptr1;
int i;
/*------创建第一个结点------*/
head
=(llink)malloc(sizeof(node));
if(!head)
return NULL;
head
->num=array[0];
head
->next=NULL;
ptr
=head;
for(i=1;i<len;i++)
{
ptr1
=(llink)malloc(sizeof(node));
if(!ptr1)
return NULL;
ptr1
->num=array[i];
ptr1
->next=NULL;
ptr
->next=ptr1;
ptr
=ptr->next;
}
return head;
}
/*--------链表的反转------*/

llink inverllist(llink head)
{
llink mid,last;
mid
=NULL;
while(head!=NULL)
{
last
=mid;
mid
=head;
head
=head->next;
mid
->next=last;
}
return mid;
}
/*-------链表的内存释放-------*/
void freellist(llink head)
{
llink ptr;
while(head!=NULL)
{
ptr
=head;
head
=head->next;
free(ptr);
}
}

/*------反转链表---------*/
int main()
{
int llist[6]={1,2,3,4,5,6};
llink head;

head
=createllist(llist,6);
if(!head)
{
printf(
"内存分配失败! \n");
exit(
1);
}
printf(
"原来的链表: ");
printllist(head);
head
=inverllist(head);
printf(
"反转后链表: ");
printllist(head);
freellist(head);

}

    

原文地址:https://www.cnblogs.com/FCWORLD/p/1882364.html