题目描述
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
/*类似与一次划分,那就用双指针,不用改指针指向,只改值
上边的思路不行,因为要保证之前的相对位置,
新开链表,一个链表放小于X的节点,一个链表放大于X的节点,再拼接
*/
public:
ListNode* partition(ListNode* head, int x) {
if(!head) return head;
ListNode * small_head=new ListNode(0);
ListNode * p=small_head;// 存放小于x的节点
ListNode* big_head=new ListNode(0);
ListNode* q=big_head;
while(head){
if(head->val<x){
p->next=head;
p=p->next;
}
else{
q->next=head;
q=q->next;
}
head=head->next;
}
p->next=big_head->next;
q->next=nullptr;
return small_head->next;
}
};