版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/laoxuan2011/article/details/55505845
对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。
给定一个链表的头结点head,同时给定阈值val,请返回一个链表,使小于等于它的结点在前,大于等于它的在后,保证结点值不重复。
测试样例:
{1,4,2,5},3
{1,2,4,5}
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Divide {
public:
ListNode* listDivide(ListNode* head, int val) {
// write code here
if(!head)
return head;
// <= > 子链表的结点的前一个结点 头结点
ListNode LowerNode(-1);
ListNode HigherNode(-1);
ListNode * pHead = head;
ListNode * pLow = &LowerNode;
ListNode * pHigh = &HigherNode;
while(pHead){
if(pHead->val <= val){
pLow->next = pHead;
pLow = pLow->next;
}else{
pHigh->next = pHead;
pHigh = pHigh->next;
}
pHead = pHead->next;
}
//拼接子链表 LowerNode是指向第一个节点结点的
pLow->next = HigherNode.next;
pHigh->next = NULL; // 第二个子链表尾结点为空
return LowerNode.next;//LowerNode是指向第一个节点结点的头结点
}
};