6.编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。OJ链接
将单链表中的一组数据头插到另一个链表中时,操作过程的代码完全相同,但是逐个头插的过程会改变数据的顺序。
尾插到另一个链表中时,操作的过程不同。第一次要改变phead的指向,并且要讨论phead是否为NULL的情况,分的情况较多较复杂,并且需要找tail,或保存下来一个tail,为了简化这一过程的代码,我们用malloc一个哨兵卫的头结点,用guard和tail指向它,然后只需要用tail->next来尾插即可,完成后数据的顺序也没有改变。
下题中,先创建一个lguard和gguard作为分隔x的两个链表,遍历原链表并分别尾插到这两个链表后,将两个链表按顺序链接,lguare->next=gguard->next,并且gtail->next要置为NULL,否则会死循环,最后要free掉创建的哨兵卫头结点(最好用malloc,这块空间不是局部变量,出作用域不会销毁)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x)
{
struct ListNode *gguard,*lguard,*gtail,*ltail;
gguard=(struct ListNode*)malloc(sizeof(struct ListNode));
lguard=(struct ListNode*)malloc(sizeof(struct ListNode));
gguard->next = NULL;
lguard->next = NULL;
gtail=gguard;
ltail=lguard;
while(pHead)
{
if(pHead->val >= x)
{
gtail->next = pHead;
gtail=gtail->next;
}
else
{
ltail->next = pHead;
ltail=ltail->next;
}
pHead = pHead->next;
}
ltail->next = gguard->next;
gtail->next = NULL;
pHead = lguard->next;
free(gguard);
free(lguard);
return pHead;
}
};