Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
Example:
Input: head = 1->4->3->2->5->2, x = 3 Output: 1->2->2->4->3->5
这是一道很典型的双指针的问题,涉及两个指针的移动,
这里我们还是像之前一样给输入的链表添加一个头部,让逻辑变得通顺。
指针的移动就应该是对指针的前一项指针进行操作的。
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if (head == nullptr) return head;
ListNode *t1 = new ListNode(0);
t1->next = head;
ListNode *rh = t1;
ListNode* t2 = t1;
while (t2!=nullptr&&t2->next != nullptr)
{
//printlist(rh);
if (t2->next->val<x)
{
if (t1 != t2)
{
ListNode* x1 = t1->next, *x2 = t2->next;
t2->next = x2->next;
t1->next = x2;
x2->next = x1;
}
else t2 = t2->next;
t1 = t1->next;
}
else t2 = t2->next;
}
return rh->next;
}
};