LeetCode-链表分割

链表分割

题目描述

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

示例1
在这里插入图片描述

思路解析

开两个新链表将小于x的节点放入第一个新链表中,将大于x的节点放入第二个新链表中,然后将第二个新链表尾插到第一个新链表上

图解如下:
在这里插入图片描述

代码实现

class Partition {
    
    
public:
    ListNode* partition(ListNode* pHead, int x) 
    {
    
    
        ListNode* cur = pHead;
        //小于x的节点放入链表newhead1
        ListNode* newhead1 = NULL;
        //大于x的节点放入链表newhead2
        ListNode* newhead2 = NULL;
        ListNode* tail1 = NULL;
        ListNode* tail2 = NULL;
        //开两段新空间
        newhead1 = tail1 = (ListNode*)malloc(sizeof(ListNode));
        newhead2 = tail2 = (ListNode*)malloc(sizeof(ListNode));
        //大于等于x放newhead2,小于x放newhead1
        while(cur)
        {
    
    
            if(cur->val >= x)
            {
    
    
                tail2->next = cur;
                tail2 = cur;
            }
            else
            {
    
    
                tail1->next = cur;
                tail1 = cur;
            }
            cur = cur->next;
        }
        //大于x链表尾插到小于x的链表后面
        tail1->next = newhead2->next;
        //让最后一个节点next指向空
        tail2->next = NULL;
        //保存链表头地址,防止释放空间找不到
        ListNode* tem = newhead1->next;
        //释放空间
        free(newhead1);
        free(newhead2);
        return tem;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_50886514/article/details/113483807
今日推荐