思路:设置两个新链表,一个存比3小的数,另一个存放比3大的数,再将两个链表合并在一起
先创建两个头结点,smallhead和bighead
创建好之后就是将数据插入到两个数组中,经过一轮之后:
第二轮之后:(上下两条链表实际上是一条链表,这里是为了方便看)
最后:
到这问题差不多就解决了,但是上面那一行最后连了一个2这是为什么呢,这是因为当出现>x的数就会把他后面表链全接到bigtail的后面,最后一个数是<x就不会出现这种情况
如图所示:
如果这个时候再把bighead链接到smallhead上去,会导致形成一个环
所以我们应该把bigtail->next=NULL就能解决这个问题
来看看具体代码
ListNode* partition(ListNode* pHead, int x)
{
struct ListNode* smalltail, * bigtail, * smallhead, * bighead;
//创建两个头结点bighead和smallhead
smallhead = smalltail = (struct ListNode*)malloc(sizeof(struct ListNode));
bighead = bigtail = (struct ListNode*)malloc(sizeof(struct ListNode));
while (pHead != NULL)
{
if (pHead->val < x)
{
smalltail->next = pHead;
smalltail = smalltail->next;
}
else
{
bigtail->next = pHead;
bigtail = bigtail->next;
}
pHead = pHead->next;
}
bigtail->next = NULL; //将bighead的链表后面置空防止出现环
smalltail->next = bighead->next; //将两个链表链接起来
return smallhead->next;
}