方法一:
首先找到第一个大于等于目标值的前一位置,用于插入小于目标值的节点。为防止第一个就满足,首先建立一个新的节点-1,一定小于目标值。
遍历链表,找到该位置。
从该位置开始(防止指针越界,至少该位置是存在的,下一个位置不一定存在)遍历,判断是否小于目标值,若是,插入到pre后,更新pre,更新cur->next,下次遍历时不需要更新cur。
若大于等于目标值,继续遍历。
代码如下
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode *dimmy=new ListNode(-1);
dimmy->next=head;
ListNode *pre=dimmy,*cur=head;
while(pre->next&&pre->next->val<x)pre=pre->next;//先找到大于等于目标值的第一个位置
cur=pre;
while(cur->next){
if(cur->next->val<x) {
ListNode *tmp=pre->next;
pre->next=cur->next;
cur->next=cur->next->next;//更新cur->next,不需要更新cur
pre->next->next=tmp;
pre=pre->next;//更新pre
}
else{
cur=cur->next;}
}
return dimmy->next;
}
};
方法二:
将比目标值小的新建为新链表,原链表只剩下大于等于目标值的,最后连起来
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if (!head) return head;
ListNode *dimmy=new ListNode(-1);
ListNode *newdimmy=new ListNode(-1);
dimmy->next=head;
ListNode *cur=dimmy,*p=newdimmy;
while(cur->next){
if(cur->next->val<x) {
p->next=cur->next;
cur->next=cur->next->next;//更新cur->next,不需要更新cur
p->next->next=NULL;
p=p->next;
}
else{
cur=cur->next;}
}
p->next=dimmy->next;
return newdimmy->next;
}
};