链表实现的稳定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)最后将三个子链表串起来

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值