题目:
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
输入:head = [2,1], x = 2
输出:[1,2]
解题思路:
1. 遍历原链表的所有节点,遇到小于x的节点,就插入到小链表中
2. 反之,遇到大于等于x的节点就插入到大链表中
3. 这样可以保留每个节点的原始顺序不被打乱
4. 遍历结束后,将大链表插入到小链表之后即可
源代码如下:
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* small= new ListNode(0);//创建小链表的头节点
ListNode* small_head=small;//保存头节点
ListNode* big= new ListNode(0);//创建大链表的头节点
ListNode* big_head=big;
while(head)//循环结束条件:原链表为空
{
//遇到小于x的节点,插入到小链表
if(head->val<x)
{
small->next=head;
//同时小链表的节点往后移
small=small->next;
}
//遇到大于等于x的节点,插入到大链表
else
{
big->next=head;
big=big->next;
}
//注意head指针的指向每次要更新
head=head->next;
}
//遍历结束后,将大链表big指针的next置为空
big->next=NULL;
//将大链表连接到小链表之后
//注意这里是大链表前面保存过的头节点big_head,而不是big指针
small->next=big_head->next;
//返回小链表的头节点
return small_head->next;
}
};