题目描述
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
主要思路:
利用尾插法,开辟两个新的链表,分别将<x和>=x的结点分成两份,然后再将两个链表相连,最后返回第一个链表的头指针就完成了,(在开辟两个新的链表的时候,我们可以开辟两个哨兵位的结点,这样会更方便尾插,最后返回第一个链表的第二个结点就可以了)
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
//开辟两个哨兵位的结点
ListNode* lesshead, *lesstail;
ListNode* greaterhead, *greatertail;
lesshead = lesstail = (ListNode*)malloc(sizeof(ListNode));
greaterhead = greatertail = (ListNode*)malloc(sizeof(ListNode));
lesstail->next = greatertail->next = NULL;
//讲链表分成两份
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;
//注意要把尾指针指向NULL,因为第二个链表的尾指针可能会指向原来他指向的位置
greatertail->next = NULL;
//最后返回第一个链表的第二个结点
ListNode* realhead = lesshead->next;
return realhead;
}
};