牛客网CM11 链表分割

题目

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

链接:链表分割_牛客题霸_牛客网 (nowcoder.com)

题解

设置两个新链表,把小于x的结点全部尾插到第一个链表中,大于等于x的结点全部尾插到第二个链表中,最后在把两个链表链接起来,返回第一个链表的头指针。这里使用哨兵,可以不用讨论lesstail和greatertail为空的情况,简化问题。注意,两个链表合并之后,greatertail的next需要置空,因为结点仍保留着之前的链接关系,下面示例刚好greatertail的next为空指针。

牛客网CM11 链表分割_第1张图片

 

 代码如下:

struct ListNode* partition(struct ListNode* pHead, int x) 
{
    struct ListNode* lesshead, * lesstail, * greaterhead, * greatertail;
    lesshead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));
    greaterhead = greatertail = (struct ListNode*)malloc(sizeof(struct ListNode));
    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;
}

你可能感兴趣的:(练习题,c语言,链表,算法,数据结构)