题目:
现有一链表的头指针 ListNode* pHead
,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
思路:
大链表存放比x大的值,小链表存放比x小的值,最后将大链表接在小链表后面
细节:
① 由于尾部链接结点时会将该结点后面整个链接上去,所以可能会形成环,故在表最后加上NULL
② 头结点最后释放
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// write code here
struct ListNode* lessHead,*greaterHead,*lessTail,*greaterTail;
lessHead=lessTail=(struct ListNode*)malloc(sizeof(struct ListNode));
lessTail->next=NULL;
greaterHead=greaterTail=(struct ListNode*)malloc(sizeof(struct ListNode));
greaterTail->next=NULL;
struct ListNode* cur=pHead;
while(cur)
{
if(cur->val < x)
{
lessTail->next=cur;
lessTail=cur;
}
else
{
greaterTail->next=cur;
greaterTail=cur;
}
cur=cur->next;
}
lessTail->next=greaterHead->next;
greaterTail->next=NULL;
struct ListNode*newHead=lessHead->next;
free(lessHead);
free(greaterHead);
return newHead;
}
};