leetcode每日一题33

86.分隔链表

因为对链表中的一个节点进行更换位置的操作需要知道该节点的上一个节点

所以建立一个虚拟头节点

cpp 复制代码
ListNode* p=new ListNode(-201,head);

根据题意,我们需要找到第一个大于x或等于x的节点large

并且将第一个大于或等于x的节点large后的所有小于x的节点都挪到large前

但是在代码里为了方便挪动节点位置,large为第一个大于x的节点的前一个节点

首先我们要找到第一个大于或等于x的节点

cpp 复制代码
ListNode* p=new ListNode(-201,head);
ListNode* large=p;
ListNode* cur=p;
int flag=0;
while(cur->next)
{
    if(cur->next->val>=x&&flag==0)
    {
        large=cur;
        flag=1;
    }
    cur=cur->next;
}

然后再从large后第一个节点开始找,找那些小于x的节点,并挪到large前

这一步要分三个情况

  1. 当前节点cur大于等于x,cur指向下一个节点
  2. 当前节点cur小于x,且当前节点不是链表最后一个节点,正常挪
  3. 当前节点cur小于x,且当前节点是链表最后一个节点,这个时候指针变换时有一个会指向nullptr,要特别写出来
cpp 复制代码
cur=large->next;
while(cur&&cur->next)
{
    if(cur->next->val<x&&cur->next->next)
    {
        ListNode* temp1=large->next;
        ListNode* temp2=cur->next->next;
        large->next=cur->next;
        cur->next->next=temp1;
        cur->next=temp2;
        large=large->next;
    }
    else if(cur->next->val<x&&cur->next->next==nullptr)
    {
        ListNode* temp1=large->next;
        large->next=cur->next;
        cur->next->next=temp1;
        cur->next=nullptr;
        large=large->next;
    }
    else
        cur=cur->next;
}
return p->next;

最后增加一些边界条件

cpp 复制代码
if(head==nullptr||head->next==nullptr)
            return head;
if(flag==0)//如果找不到大于x的节点
{
    return p->next;
}

整合起来

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* p=new ListNode(-201,head);
        ListNode* large=p;
        ListNode* cur=p;
        int flag=0;
        if(head==nullptr||head->next==nullptr)
            return head;
        while(cur->next)
        {
            if(cur->next->val>=x&&flag==0)
            {
                large=cur;
                flag=1;
            }
            cur=cur->next;
        }
        if(flag==0)//如果找不到大于x的节点
        {
            return p->next;
        }
        cur=large->next;
        while(cur&&cur->next)
        {
            if(cur->next->val<x&&cur->next->next)
            {
                ListNode* temp1=large->next;
                ListNode* temp2=cur->next->next;
                large->next=cur->next;
                cur->next->next=temp1;
                cur->next=temp2;
                large=large->next;
            }
            else if(cur->next->val<x&&cur->next->next==nullptr)
            {
                ListNode* temp1=large->next;
                large->next=cur->next;
                cur->next->next=temp1;
                cur->next=nullptr;
                large=large->next;
            }
            else
                cur=cur->next;
        }
        return p->next;
    }
};

不过

其实第二步,从large后开始找小于x的数,完全可以合到第一步的循环里做

这部分需要再优化一下

相关推荐
蒙奇D索大5 分钟前
【数据结构】图解图论:度、路径、连通性,五大概念一网打尽
数据结构·考研·算法·图论·改行学it
uhakadotcom9 分钟前
2025年春招:如何使用DeepSeek + 豆包优化简历,轻松敲开心仪公司的大门
算法·面试·github
小白狮ww13 分钟前
Retinex 算法 + MATLAB 软件,高效率完成图像去雾处理
开发语言·人工智能·算法·matlab·自然语言处理·图像识别·去雾处理
444A4E1 小时前
C++模板:泛型编程的魔法手册,从入门到“魔改”
c++·编译原理
trust Tomorrow1 小时前
每日一题-力扣-2278. 字母在字符串中的百分比 0331
算法·leetcode
Chiyamin1 小时前
C++面向对象速览(三)
c++
Tadecanlan2 小时前
[C++面试] 智能指针面试点(重点)续4
开发语言·c++·面试
Chiyamin2 小时前
C++面向对象速览(一)
c++
Lecea_L2 小时前
你能在K步内赚最多的钱吗?用Java解锁最大路径收益算法(含AI场景分析)
java·人工智能·算法
Tony882 小时前
热题100 - 394. 字符串解码
java·算法