题目
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
题解
设置两个新链表,把小于x的结点全部尾插到第一个链表中,大于等于x的结点全部尾插到第二个链表中,最后在把两个链表链接起来,返回第一个链表的头指针。这里使用哨兵,可以不用讨论lesstail和greatertail为空的情况,简化问题。注意,两个链表合并之后,greatertail的next需要置空,因为结点仍保留着之前的链接关系,下面示例刚好greatertail的next为空指针。
代码如下:
struct ListNode* partition(struct ListNode* pHead, int x) { struct ListNode* lesshead, * lesstail, * greaterhead, * greatertail; lesshead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode)); greaterhead = greatertail = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* cur = pHead; while (cur) { if (cur->val < x) { lesstail->next = cur; lesstail = lesstail->next; } else { greatertail->next = cur; greatertail = greatertail->next; } cur = cur->next; } lesstail->next = greaterhead->next; greatertail->next = NULL; pHead = lesshead->next; free(lesshead); free(greaterhead); return pHead; }