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);

    }

        

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/1882364.html
Copyright © 2011-2022 走看看