链表中的冒泡排序(C++递归实现)

因为链表不能像数组一样用下标访问,而只能用next访问,所以我们只能用next做文章了。
考虑下面两种方案:
1.从前往后遍历交换。
2.从后往前遍历交换

对于方案1,比如我们要对2, 3,1, 4做一个升序,当我们遍历到1时,可以交换1和3,交换后顺序为2,1,3,4,但因为没有一个向前的指针,导致我们无法完成2和1的交换,除非我们从头开始做第二次遍历才能完成2和1的交换,这显然就太复杂了。这样来看,每个数最多只能向前移动一步,这样就很麻烦,。

对于方案2,我们可以通过递归至最后一个节点,然后往前,考虑2,1,6,3,5,4,遍历到4时返回,此时head指向5,交换4和5,交换后的顺序为2,1,6,3,4,5,这步肯定没问题。当我们遍历到6这个节点时,交换6和3,但因为6最大,肯定 还需要往后面移动,这里利用whlie循环,而且可以通过next遍历比较至最后。

总的来说,因为链表的限制,我们只能用next指针。而通过递归,在将后面节点排序好之后,我们是可以返回前一个节点的,这样我们就可以将某个节点只与后面的比较,而不用与前面的比较了,这就是通过从后往前遍历实现的。

static void list_sort(struct node *head)//递归调用
{
    //TODO:
    if(head==NULL||head->next==NULL) return;//因为需要做数值比较,我们在最后一个有值的节点返回
    list_sort(head->next);
    node* t_head=head;//用一个临时指针去遍历,保证head位置不变
    while(t_head->next!=NULL && (t_head->val)>(t_head->next->val))
    {
        int temp = t_head->val;
        t_head->val=t_head->next->val;
        t_head->next->val=temp;
        t_head=t_head->next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值