题目描述:
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ,请返回重新排列后的链表的头指针
注意:分割以后保持原来的数据顺序不变
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
思路分析:
1.创建两个结果链表,分为1和2,一个用来保存小于基准值的节点,另一个用来保存大于基准值的节点
2.对原先的链表进行遍历,如果比基准值小,用尾插的方法插入第一个结果链表,反之,插入第二个
3.插入完毕之后进行两个链表的合并,将第一个链表的最后一个节点的next指向第二个链表
4.注意极端情况:
1.保存大于基准值的链表的最后一个节点不一定指向空,所以最后我们记得处理!!
2.有可能给出的基准值比其中一整条链表保存的数都大,所以这时直接返回另一条链表
代码示例:
class Partition {
public:
ListNode* partition(ListNode* pHead, int x)
{
ListNode* result1 = NULL;
ListNode* last1 = NULL;
ListNode* last2 = NULL;
ListNode* result2 = NULL;
ListNode* pCur = pHead;
while (pCur != NULL)
{
if (pCur->val < x)
{
if (result1 == NULL)
{
result1 = last1 = pCur;
}
else
{
last1->next = pCur;
last1 = pCur;
}
}
else
{
if (result2 == NULL)
{
result2 = last2 = pCur;
}
else
{
last2->next = pCur;
last2 = pCur;
}
}
pCur=pCur->next;
}
if(last1!=NULL)
{
last1->next = result2;
}
if (last2 != NULL)
{
last2->next = NULL;
}
if(last1!=NULL)
{
return result1;
}
else
{
return result2;
}
}
};