荷兰国旗问题描述:
给定一个数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的链表