链表插入排序(insertion-sort-list)

   自己写的代码有几个比较大的用例一直过不去,网上的代码大部分有问题,思路是先将链表置空表,再将链表中的元素循环插入到指定位置。

  下面是一份正确的代码,但是是带头节点的链表

void Insertsort(Linklist &L)

{

    LNode *p,*q,*r,*u;

    p=L->next;L->next=NULL;  //置空表,然后将原链表结点逐个插入到有序表中

    while(p!=NULL)

   {          //当链表尚未到尾,p为工作指针

        r=L;q=L->next;

        while(q!=NULL&&q->data<=p->data)

       {  //查P结点在链表中的插入位置,这时q是工    作指针

            r=q;q=q->next;

        }

        u=p->next;

        p->next=r->next;

        r->next=p;

        p=u; //将P结点链入链表中,r是q的前驱,u是下一个待插入结点的指针

    }

}   

 本题是没有头节点的链表,修改后如下:

void Insertsort(Linklist &L)

{

  ListNode *p,*u,*r,*q,*s; /*h2用来指向需要插入的结点,h3用来指向h2的前一个结点 

  p=L->next; 

  L->next=NULL; //置空表,然后将原链表结点逐个插入到有序表中 

  while(p!=NULL) 

  { //当链表尚未到尾,p为工作指针 

    r=L; 

    q=L->next; 

    if(p->val < L->val) 

    { 

      s=L; 

      u=p->next; 

      p->next=L; 

      L=p; 

      p=u; 

    } 

    else 

    { 

      while(q!=NULL&&q->val<=p->val) 

      { //查P结点在链表中的插入位置,这时q是工作指针 

         r=q;

         q=q->next; 

      } 

      u=p->next; 

      p->next=r->next; 

      r->next=p; 

      p=u; //将P结点链入链表中,r是q的前驱,u是下一个待插入结点的指针 

    } 

  }

}

  

 

你可能感兴趣的:(insert)