解题思路:
第一反应就是找一个中间点,小的扔一边,大的扔一边。
顺手敲完麻烦的,再重新花了点时间简化。
第一反应版本
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
//好朋友,排排队
ListNode *head_min=new ListNode(0); //小于x的数的头节点
ListNode *head_max=new ListNode(0); //大于等于x的数的头节点
head_min->next=head_max; //将这两个分堆的链表链接起来
ListNode *node=head; //正在处理的结点
ListNode *dummy=head_min; //保留返回位置
while(head!=NULL){
node=head;
head=head->next;
if(node->val<x){ //小于x的节点扔到head_min这一堆。
node->next=head_min->next;
head_min->next=node;
head_min=head_min->next;
}
else{ //大于等于x的节点扔到head_max这一堆
head_max->next=node;
head_max=head_max->next;
head_max->next=NULL;
}
}
head_min->next=head_min->next->next; //链接处有一个没有信息的节点(刚开始创立的head_max)
return dummy->next;
}
};
敲完后重新搞得简化版本
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
//直接以第一个节点为分界点
ListNode *now=head;
while(now && now->next){ //防止初始值操作报错,及一次遍历链表
if(now->next->val < x){ //小于x的节点采用头插法插入到第一个指针前面
ListNode *node = now->next;
now->next=node->next;
node->next=head;
head=node;
}
else
now=now->next; //大于等于x的节点直接向后遍历
}
return head;
}
};