创建一条单链表,并输入一个分界的数字,使得该数字对应的结点左边都是小于该数字的结点,右边的是大于该数字的结点。不必有序。
创建一个int类型的数组(也可以是Node),将所有的结点放进该数组中,然后开始partition.当做是荷兰国旗问题就可以解决了.
//链表划分
#include <bits/stdc++.h>
using namespace std;
struct Node{
int val;
Node* next;
};
class Solution {
public:
Node* head;
Node* end;
int len;
Solution(){
//咋们将链表设置为有头结点的.就是第一个结点是没有数据的那种
Node* node = new Node();
node->next = NULL;
head = node;
end = node;
len = 0;
}
void swap(int arr[],int l,int r){
//抖机灵的算法,但是切记,两个数字是不能相同的
// arr[l] = arr[l]^arr[r];
// arr[r] = arr[l]^arr[r];
// arr[l] = arr[l]^arr[r];
int tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
}
/**
*
* @param head ListNode类
* @param x int整型
* @return ListNode类
*/
void partition(int x) {
// write code here
int arr[len];
Node* p = head->next;
int i = 0;
while(p != NULL){
arr[i] = p->val;
p = p->next;
i++;
}
//开始分界
int less = -1;//<区
int bet = len-1;//>区
//找到分界的数字所在的元素下标
int sub = 0;
for(i = 0; i < len; i++) {
if(arr[i] == x){
sub = i;
break;
}
}
//将分界的数字放在最后的位置
swap(arr,sub,bet);
for(i = 0;i < bet;i++){
if(arr[i] < x){
//当前元素是小于分界元素的,需要将其交换到<区
cout<<arr[less+1]<<"与"<<arr[i]<<"交换"<<endl;
swap(arr,++less,i);
}else if(arr[i] > x){
//当前元素是大于分界元素的,需要将其交换到>区
cout<<arr[bet-1]<<"与"<<arr[i]<<"交换"<<endl;
swap(arr,--bet,i);
}
//当前元素是等于分界元素的,不需要交换
}
//最后将放在最后的分界元素交换到中间来
swap(arr, len-1, bet);
//将数组元素串联成链表返回
p = head->next;
i = 0;
while(p != NULL){
p->val = arr[i];
i++;
p = p->next;
}
}
Node* push(int i){
Node* node = new Node();
node->val = i;
end->next = node;
end = node;
len++;
}
void show(){
Node* p = head->next;
while(p != NULL){
cout<<p->val<<" ";
p = p->next;
}
cout<<endl;
}
};
int main(void){
Solution s;
//输入多少的数据
int n;
cin>>n;
//开始输入数据
while(n--){
int a;
cin>>a;
s.push(a);
}
//输出分界之前的链表
cout<<"输出分界之前的链表"<<endl;
s.show();
//输入分界的数字
int k;
cout<<"输入分界的数字:"<<endl;
cin>>k;
s.partition(k);
cout<<"开始输出分界之后的数据"<<endl;
s.show();
return 0;
}