zoukankan      html  css  js  c++  java
  • 链表结构的反转(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);

    }

        

  • 相关阅读:
    java 网络编程
    JAVA 中for-each循环使用方法
    JAVA 常用集合接口List、Set、Map总结
    android学习计划
    ExtJs
    jQuery easyui
    MVC
    简易servlet计算器
    使用servlet实现用户注册功能
    用JavaBean实现数据库的连接和关闭,在jsp页面输出数据库中student表中学生的信息
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/1882364.html
Copyright © 2011-2022 走看看