自己写的代码有几个比较大的用例一直过不去,网上的代码大部分有问题,思路是先将链表置空表,再将链表中的元素循环插入到指定位置。
下面是一份正确的代码,但是是带头节点的链表:
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是下一个待插入结点的指针 } } }