一、题目介绍
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
二、解题思路
(1)遍历链表找到第一个大于或者等于特定值x的链表节点cur,并记录该节点的前置节点prev。
(2)继续遍历剩下的节点,如果某个节点的值小于特定值x,那么就将该节点从原来的位置移除,然后插入到prev节点和cur节点之间,并将prev指针更新为新插入的节点。
(3)重复第二步操作,直到遍历到单链表的结尾。
三、解题代码
ListNode* partition(ListNode* head, int x) {
ListNode* newNode = new ListNode(0);
newNode->next = head;
ListNode* prev = newNode;
ListNode* prevTemp = prev;
ListNode* cur = NULL;
while(head)
{
if(head->val >= x && cur == NULL)
{
cur = head;
}
else if(head->val < x && cur == NULL)
prev = head;
else if(head->val < x)
{
prevTemp->next = head->next;
head->next = cur;
prev->next = head;
prev = head;
head = prevTemp->next;
continue;
}
prevTemp = head;
head = head->next;
}
return newNode->next;
}