LeetCode Day68 partition list

方法一:

首先找到第一个大于等于目标值的前一位置,用于插入小于目标值的节点。为防止第一个就满足,首先建立一个新的节点-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;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41394379/article/details/87794140