给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
其实这道题直接的思路就可以做。首先要找到大于等于x的第一个值的前一个结点,作为插入位置的左边。然后再开始找小于x的节点做插入。注意每次插入后,插入位置的左边都要指向下一个元素,保证插入位置的右端不变。
/**
* 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 {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* helperHead = new ListNode(INT_MIN, head);
ListNode* curNode = helperHead;
ListNode* insertLeft = helperHead;
// 首先找到小于x的节点的插入位置
while (curNode -> next != nullptr) {
if (curNode -> next -> val >= x) {
insertLeft = curNode;
curNode = curNode -> next;
break;
}
curNode = curNode -> next;
}
while (curNode -> next != nullptr) {
if (curNode -> next -> val < x) {
ListNode* tempNode = curNode -> next;
curNode -> next = tempNode -> next;
tempNode -> next = insertLeft -> next;
insertLeft -> next = tempNode;
insertLeft = insertLeft -> next;
continue;
}
curNode = curNode -> next;
}
return helperHead -> next;
}
};