当前位置:编程学习 > C/C++ >>

链表的反转

(1)链表的反转

 原先的链表保留一个头结点head,通过该头结点可以遍历链表的每一个结点里内容,如果在链表遍历的过程中,再用两个指针把把链表里的内容指针的指向改变,使原先指向下一个节点的,改为指向它的前一个节点,就可以实现链表的反转了!

#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];

       ptr->next=NULL;

       ptr->next=ptr1;

       ptr=ptr->next;     

    }

    return head; 

  }

//链表反转的实现过程

  llink invertllist(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)

  {

   exit(1);        

  } 

  printllist(head);

  head=invertllist(head);

  printllist(head);

 printllist(head);

 return 0;   

}

分享到:

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,