现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
//把小于x的尾插到一个链表
//把大于x的尾插到一个链表
//再把两个链表链接到一起
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
ListNode* lessHead,*lessTail,*greaterHead,*greaterTail;
lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));
greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));
lessTail->next = NULL;
greaterTail->next = NULL;
struct ListNode* cur = pHead;
while(cur)
{
if(cur->val < x)
{
lessTail->next = cur; //尾插到小的值的链表中
lessTail = lessTail->next;
}
else
{
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;
}
};