单链表带哨兵卫的头结点的好题分享

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;


    }
};

 

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值