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的数,完全可以合到第一步的循环里做

这部分需要再优化一下

相关推荐
布莱克6051 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
ZhengEnCi2 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是3 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考3 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
沫璃染墨5 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
nm_zfyjt6 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
xiaoye-duck7 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
w_zero_one7 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼7 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
旖旎夜光8 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习