1. 题目描述
牛客网在线OJ——CM11 链表分割
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
2. 思路
思路: 设置两个链表。
把小于x的值尾插到一个链表,
把大于x的值尾插到另一个链表,
最后链接起来
这里使用带哨兵的链表
3.代码实现
这里只能选择C++没有C可以选,但是可以直接在C++中写C语言,
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
#include <functional>
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// write code here
struct ListNode * moreGuard ,*lessGuard,*moreTail ,*lessTail;
moreGuard = moreTail = (struct ListNode *)malloc(sizeof(struct ListNode));
lessGuard = lessTail = (struct ListNode *)malloc(sizeof(struct ListNode));
moreTail->next =lessTail->next = NULL;
struct ListNode * cur = pHead;
while(cur)
{
if(cur->val<x)
{
lessTail->next = cur;
lessTail = lessTail->next;
}
else
{
moreTail->next = cur;
moreTail = moreTail->next;
}
cur = cur->next;
}
lessTail ->next = moreGuard->next;
moreTail->next = NULL;
pHead = lessGuard->next;
free(moreGuard);
free(lessGuard);
return pHead;
}
};