单链表递增排列的算法理解

将L先拆成一个只有一个节点的有序表,用P指向L的元素。第一次将L的第一个节点与P比较(这时候的P指向的是L的第二个元素),如果小于则退出第一个循环将P插入pre之后(这时pre指向的是头结点)。插入之后P向后移,L现在由一个元素变为两个元素,且L仍为有序表。

假设L现在有十个元素,P指向原来L的第十一个元素,现在将L中的每个元素与P进行比较,当P小于L中某一个元素时,就将P插入该元素的前一个元素。L仍然为一个有序表

最后循环完成后,就通过P将L中每个元素进行了排序。

void sort(LinkList *&L)

{  LinkList *p,*pre,*q;

   p=L->next->next;       //p指向L的第2个数据节点

   L->next->next=NULL;         //构造只含一个数据节点的有序表

   while (p!=NULL)

   { q=p->next;                //q保存*p节点后继节点的指针

         pre=L;  //从有序表开头进行比较,pre指向插入*p的前驱节点

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

            pre=pre->next; //在有序表中找插入*p的前驱节点*pre

         p->next=pre->next;//将*pre之后插入*p

         pre->next=p;

         p=q;                   //扫描原单链表余下的节点

   }

}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值