链表分割
题目描述
现有一链表的头指针 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;
}
};