[编程题]链表分割
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
思路
遍历链表,将小于x的节点尾插入a链表。大于等于x的节点尾插入b链表。然后将两个链表连接起来。
注意:
当吧两个链表链接起来的时候,要把greater链表的最后一个节点的next置为NULL。
不然会造成死循环。
代码:
struct ListNode* partition(struct ListNode* pHead, int x) {
struct ListNode* smallNode = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* smallhead = smallNode;
struct ListNode* bigNode = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* bigHead = bigNode;
struct ListNode* tail = pHead;
while (tail)
{
if (tail->val < x)
{
smallNode->next = tail;
smallNode = smallNode->next;
}
else
{
bigNode->next = tail;
bigNode = bigNode->next;
}
tail = tail->next;
}
smallNode->next = bigHead->next;
bigNode->next = NULL;
struct ListNode* newhead = smallhead->next;
free(smallhead);
free(bigHead);
return newhead;
}