对链表进行插入排序(C语言)

现有一无序链表:
在这里插入图片描述

要求在空间复杂度为O(1)上给该链表排序。

思路:
借助初学链表时的头插和前插来解决。
如果值为1的结点比5的节点小,则需要移动值为1的结点(插入到5的前面)因为5是头结点,所以可以头插。

这样做每次都需要从头结点遍历一遍(包括自身)然后再排序,就很麻烦。

所以:可以将链表分成两个链表,链表A、链表B,将头结点分割给链表A,将剩下的结点分给链表B。

将链表B中的结点,依次遍历,每次遍历在链表A中插入一个结点。
在这里插入图片描述
步骤一:
拿取链表splitedList中的首元结点与链表sortedList中的所有结点相比。
开始遍历链表splitedList。
在这里插入图片描述

此时会有三种情况:

  1. 头插
  2. 在某个结点前插入
  3. 尾插
    1、头插:链表splitedList中的首元结点可能比链表sortedList中的首元结点还要小,此时需要头插。
    2、在某个结点前插入:比某个节点大,但比这个结点的直接后继小。此时需要在这个结点的直接后继前插入。
    3、尾插:如果这个结点比链表sortedList中所有结点都大,此时需要尾插。

为什么要在结点前面插入:
如果在结点前、节点后都可以插入的话,会将逻辑变复杂,代码会很乱,不好控制循环。

此时我们发现,链表splitedList的首元结点比链表sortedList中的首元结点小。这时就需要头插了。

将链表splitedList的首元结点插入到链表sortedList中的首元结点后,将链表splitedList指向值为5的结点。
然后重复的比较下去。
(比较链表splitedList一个元素则需遍历一遍链表sortedList)。
直到链表splitedList遍历完。
C语言代码:

 Definition for singly-linked list
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值