题目描述
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
解题思路:首先,先定义两个新的头节点,分别用来保存小于x的节点和不小于x的节点,遍历原链表,当前节点小于x的时候,将它放在定义的新的节点后,当前节点不小于x的时候,将它放在定义的另一个新的节点后。最后将全部小节点的尾链接上大节点的头即可。画图分析:
代码实现:
ListNode* partition(ListNode* pHead, int x)
{
ListNode* cur = pHead;
ListNode *smallhead =NULL,*bighead = NULL;
ListNode *smalltail = NULL,*bigtail = NULL;
while(cur)
{
if(cur->val < x)
{
if(smallhead == NULL)
{
smallhead = smalltail = cur;
}
else
{
smalltail->next = cur;
smalltail = cur;
}
}
else
{
if(bighead == NULL)
{
bighead = bigtail= cur;
}
else
{
bigtail->next = cur;
bigtail = cur;
}
}
cur = cur->next;
}
if(smallhead && bighead)
{
smalltail->next = bighead;
bigtail->next = NULL;
}
else if(smallhead == NULL && bighead)
{
return bighead;
}
return smallhead;
}