版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目描述:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
C++
#include <vector>
#include <stdio.h>
#include <algorithm>
using namespace std;
#include <iostream>
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode *createLinkedList(int nums[], int len_nums)
{
if (len_nums == 0)
{
return NULL;
}
ListNode *head = new ListNode(nums[0]);
ListNode *curNode = head;
int i = 1;
while (i < len_nums)
{
ListNode *nextNode = new ListNode(nums[i]);
curNode->next = nextNode;
curNode = nextNode;
i++;
}
curNode->next = NULL;
return head;
}
void printLinkedList(ListNode *head)
{
ListNode *curNode = head;
while (curNode != NULL)
{
printf("%d -> ", curNode->val);
curNode = curNode->next;
}
printf("NULL\n");
}
class Solution
{
public:
ListNode *partition(ListNode *head, int x)
{
if (head == NULL)
{
return NULL;
}
ListNode *root = new ListNode(0);
root->next = head;
ListNode *curNode = root;
ListNode *preNode = NULL;
ListNode *moveNode = head;
ListNode *nextNode = NULL;
while (moveNode != NULL)
{
if (moveNode->val < x)
{
if (moveNode->next != NULL)
{
if (preNode)
{
preNode->next = moveNode->next;
}
curNode->next = moveNode;
curNode = moveNode;
moveNode = moveNode->next;
}
else
{
if (preNode)
{
preNode->next = NULL;
}
curNode->next = moveNode;
curNode = moveNode;
moveNode = NULL;
}
}
else
{
if (!nextNode)
{
nextNode = moveNode;
}
preNode = moveNode;
moveNode = moveNode->next;
}
}
curNode->next = nextNode;
return root->next;
}
};
int main()
{
int nums[] = {1, 1};
int len_nums = sizeof(nums) / sizeof(int);
ListNode *head = createLinkedList(nums, len_nums);
printLinkedList(head);
int x = 2;
ListNode *ans = Solution().partition(head, x);
printLinkedList(ans);
return 0;
}