现有一无序链表:
要求在空间复杂度为O(1)上给该链表排序。
思路:
借助初学链表时的头插和前插来解决。
如果值为1的结点比5的节点小,则需要移动值为1的结点(插入到5的前面)因为5是头结点,所以可以头插。
这样做每次都需要从头结点遍历一遍(包括自身)然后再排序,就很麻烦。
所以:可以将链表分成两个链表,链表A、链表B,将头结点分割给链表A,将剩下的结点分给链表B。
将链表B中的结点,依次遍历,每次遍历在链表A中插入一个结点。
步骤一:
拿取链表splitedList中的首元结点与链表sortedList中的所有结点相比。
开始遍历链表splitedList。
此时会有三种情况:
- 头插
- 在某个结点前插入
- 尾插
1、头插:链表splitedList中的首元结点可能比链表sortedList中的首元结点还要小,此时需要头插。
2、在某个结点前插入:比某个节点大,但比这个结点的直接后继小。此时需要在这个结点的直接后继前插入。
3、尾插:如果这个结点比链表sortedList中所有结点都大,此时需要尾插。
为什么要在结点前面插入:
如果在结点前、节点后都可以插入的话,会将逻辑变复杂,代码会很乱,不好控制循环。
此时我们发现,链表splitedList的首元结点比链表sortedList中的首元结点小。这时就需要头插了。
将链表splitedList的首元结点插入到链表sortedList中的首元结点后,将链表splitedList指向值为5的结点。
然后重复的比较下去。
(比较链表splitedList一个元素则需遍历一遍链表sortedList)。
直到链表splitedList遍历完。
C语言代码:
Definition for singly-linked list