题目:
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
解读:
如果链表的内容为1 3 4 5 8 2 7,给的x的数值为6,则改变后的链表为
1 3 4 5 2 8 7
过程:
由于在原先的链表改变结点的顺序较为麻烦,因此使用两个链表分别存储比x小的结点和比x大的结点。
分别malloc两个结点:lessHead,greaterHead,再使用尾指针指向它,把小于x的结点放到 lessHead 所指的链表,把大于x的结点放到 greaterHead 所指的链表。
最后使 lessTail->next 指向 greaterHead链表的第一个结点。
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// write code here
//开一个哨兵位头结点,方便尾插
struct ListNode* lessHead = (ListNode*)malloc(sizeof(ListNode));
lessHead->next = NULL;
struct ListNode* greaterHead = (ListNode*)malloc(sizeof(ListNode));
greaterHead->next = NULL;
struct ListNode* lessTail = lessHead;
struct ListNode* greaterTail = greaterHead;
struct ListNode* cur = pHead;
while (cur)
{
if (cur->val < x)
{
lessTail->next = cur;
lessTail = cur;
}
else
{
greaterTail->next = cur;
greaterTail = cur;
}
cur = cur->next;
}
lessTail->next = greaterHead->next;
greaterTail->next = NULL;
struct ListNode* r_lessHead = lessHead->next;
free(lessHead);
free(greaterHead);
return r_lessHead;
}
};