我们知道朴素的paration是不能保证稳定性的。
现在来看一个用链表实现的稳定paration。
题目要求就是给你一个链表和一个划分元素num,要求左部小于num,中间等于num,右部大于num,并要求三块内部保持原链表的相对次序不变。
1.弱化约束:如果不保持稳定性
1)按照数组的paration,设计一个less指针和一个more指针以及他们各自的end指针,初始化为NULL。
2)遍历链表:
A.遇到的元素小于num:
a.如果less==NULL,和链表第一个节点交换后,让less和less-end等于它
b.如果less!=NULL,和less-end->next交换后,让less-end等于它
B.遇到的元素大于num:
a.如果more==NULL,和链表最后一个节点交换后,让more和more-end等于它
b.如果more!=NULL,和more-end->next交换后,让more-end等于它
C.遇到的元素等于num,直接跳过去即可
2.强化约束:保持稳定性
解法:设计六个指针,less、equal、more以及他们各自的end指针,初始化全部为空:
1)遍历一遍链表,找到一个小于、等于、大于num的结构元素,各自放在less、equal、more以及他们的end上,然后再次遍历:
1.遇到的元素小于num,如果当前地址不等于less,将其串在与less同组的end指针下,如果等于,直接跳过
2.遇到的元素小于num,如果当前地址不等于equal,将其串在与equal同组的end指针下,如果等于,直接跳过
3.遇到的元素大于num,如果当前地址不等于more,将其串在与more同组的end指针下,如果等于,直接跳过
2)最后将三个子链表串起来
边界情况:某个子链表为空