链表插入排序(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是下一个待插入结点的指针
    }
  }
}

  

 

上一篇:yii2源码学习笔记(五)


下一篇:hdu 5480(前缀和)