左神课堂之运用链表解决荷兰国旗问题,要求时间复杂度为o(n),空间复杂度为o(1),还要实现稳定性

荷兰国旗问题描述:


给定一个数n,表示一串数的个数。然后给定一个数number。接着输入n个数,请你设计一个算法,将所有这串数字中比number小的数放在左边,等于number的数放在中间,大于number的数放在右边。
示例:
输入:
5 1
1 5 2 4 0
输出:
0 1 4 2 5

基本思路:

构建3个链表,less1,cur,more。less1链表中存放的是所有小于number的数,cur链表中存放的是所有等于number的数,more链表中存放的是所有大于number的数。然后将3个链表拼接起来,输出即可。

操作:第一次先遍历题目给定的链表,找出第一个小于(等于,大于)number的数放入less1(cur,more)链表中去。然后再遍历一遍题目给定的链表,将题目给定的链表中所有小于(等于,大于)number的数按顺序放入less1(cur,more)链表中去,然后将less1,cur,more链表拼接起来,输出即可

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef struct Node
{
    int value;
    int b;//b是用来判断链表中该节点是否在第一次遍历链表的时候已经放入到了less1(cur,more)链表中去了,如果放进去了,b就为1,否则,b就为0.
    int c;//c是用来判断链表中是否有小于(等于或大于)number的数的,如果没有,c就等于0,如果有,就等于1.
    struct Node *next;
}node,* linkedlist;
int n,z,number;//n表示数字个数,z表示输入的数,number表示number
node *less1,*cur,*more;//less1代表小于number的链表的第一个节点,cur代表等于等于number的链表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值