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.
For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.
解题思路:
(1)将链表中结点的值取出存在一个动态分配的数组nums中;
(2)按照要求对数组中的值进行操作
(3)将满足要求数组中的值放回链表结点
void func(int *nums, int n, int x)
{
for (int i = n-1; i >= 0; i--)
{
if (nums[i] >= x)
{
int j;
int temp = nums[i];
for (j = i; j < n-1; j++)
{
if (nums[j+1] < x)
{
nums[j] = nums[j+1];
}
else
break;
}
nums[j] = temp;
}
}
}
struct ListNode* partition(struct ListNode* head, int x) {
if (head == NULL)
return head;
//计算链表中结点的个数
int count = 0;
struct ListNode* pNode = head;
while (pNode != NULL)
{
count++;
pNode = pNode->next;
}
//将链表中结点的值取出,放入数组nums中
pNode = head;
int *nums = (int *)malloc(sizeof(int)*count);
for (int i = 0; i < count; i++)
{
nums[i] = pNode->val;
pNode = pNode->next;
}
//对数组中的值进行操作
func(nums, count, x);
//将满足要求的数组值放回链表中
pNode = head;
for (int i = 0; i < count; i++)
{
pNode->val = nums[i];
pNode = pNode->next;
}
free(nums);
return head;
}