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

这部分需要再优化一下

相关推荐
网易独家音乐人Mike Zhou2 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
‘’林花谢了春红‘’3 小时前
C++ list (链表)容器
c++·链表·list
机器视觉知识推荐、就业指导5 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Swift社区6 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman6 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年7 小时前
数据结构 (1)基本概念和术语
数据结构·算法
Yang.997 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王7 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_7 小时前
C++自己写类 和 运算符重载函数
c++