题目描述
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。OJ链接
思路描述:malloc动态开辟两个头结点,一个是小于x为lessHead,另一个为moreHead,lessTail指向lessHead,moreTail指向moreHead,通过cur遍历整个链表,cur所对应的结点与x比较,若小于x,则lessTail->next指向cur,反之,moreTail->next指向cur。遍历完整个链表,moreTail->next指向NULL,然后将lessTail->next和moreHead->next连接。存储lessHead->next结点,释放两个头结点,返回所存储的结点。
代码:
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
if(pHead == NULL)
return pHead;
struct ListNode *lessHead, *lessTail, *moreHead, *moreTail;
lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));
moreHead = moreTail = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *cur = pHead;
while(cur != NULL)
{
if(cur->val < x)
{
lessTail->next = cur;
lessTail = cur;
cur = cur->next;
}
else
{
moreTail->next = cur;
moreTail = cur;
cur = cur->next;
}
}
moreTail->next = NULL;
lessTail->next = moreHead->next;
struct ListNode* tmp = lessHead->next;
free(lessHead);
free(moreHead);
return tmp;
}
};