1 题目描述
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
如上链表,x等于4,则需要将小于4的结点放到左边,且不改变其本身的相对顺序,即变成3>>2>>1。将大于4的放到右边,不改变相对顺序,即5>>6>>7。
所以最后得到的新链表为3>>2>>1>>5>>6>>7。
2 解题思路
通过给出的分割点,将链表分割为左右两个链表,即大于4的放一边,小于4的放一边,等于4的结点随便放哪一边都行。最后再把前后两个链表再串起来。
cur为遍历原链表指针,用两个新的头结点去尾插合法满足条件的结点。
最后将两个链表串起来。
3 完整代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
ListNode *cur=pHead;
ListNode *list1,*list1tail;
ListNode *list2,*list2tail;
list1=list1tail=(ListNode*)malloc(sizeof(ListNode));
list2=list2tail=(ListNode*)malloc(sizeof(ListNode));
list1->next=list1tail->next=NULL;
list2->next=list2tail->next=NULL;
while(cur)
{
if(cur->val<x)
{
list1tail->next=cur;
list1tail=cur;
}
else {
{
list2tail->next=cur;
list2tail=cur;
}
}
cur=cur->next;
}
list1tail->next=list2->next;
free(list2);
list2tail->next=NULL;
ListNode *head=list1->next;
free(list1);
return head;
}
};