题目描述:
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
//分割链表,分成大于和小于x的两部分,且数据顺序不能改变
// 输入:
// 4 6 8 6 3 5 3 9 1 5 , x = 5
// 输出:
// 4 3 3 1 6 8 6 5 9 5
解析:
创建两个新的头lessHead,greaterHead 和两个新的尾 lessTail, greaterTail
遍历链表,使得小于x的结点连接到lessTail中,大于等于x的结点连接到greaterTail中。
再将lessTail连到greaterHead->next上, 最后让投pHead指向lessHead->next;
注:让greaterTail->next = NULL;
ListNode* partition(ListNode* pHead, int x)
{
if (pHead == NULL)
return NULL;
struct ListNode* lessHead, *lessTail, *greaterHead, *greaterTail;
lessHead = lessTail = (ListNode*)malloc(sizeof(struct ListNode));
greaterHead = greaterTail = (ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* cur = pHead;
while (cur)
{
// 小于x的链到lessTail中
if (cur->val < x)
{
lessTail->next = cur;
lessTail = lessTail->next;
}
else //大于等于x的链到greaterTail中
{
greaterTail->next = cur;
greaterTail = greaterTail->next;
}
cur = cur->next;
}
lessTail->next = greaterHead->next;
greaterTail->next = NULL;
pHead = lessHead->next;
free(lessHead);
free(greaterHead);
return pHead;
}