链表实现的稳定paration

我们知道朴素的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)最后将三个子链表串起来

边界情况:某个子链表为空

猜你喜欢

转载自blog.csdn.net/qq_39304630/article/details/82148098