题集-链表分割

news2025/1/10 21:15:02

链表分割_牛客题霸_牛客网 (nowcoder.com)

 

链表去做的话,可以分为带哨兵位和不带哨兵位两种,但是不带哨兵位会更麻烦一些,更容易出现空指针问题。

这里两种思路都是:将小于x的结点尾插到less链表中,将大于x的结点尾插到greater链表中,最终再将lesstail指向greaterhead

不带哨兵位:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/

#include <cstddef>

class Partition {
  public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        if(pHead == NULL) return NULL;//空链表返回空
        if(pHead -> next == NULL) return pHead;
        ListNode* lesshead = NULL, * lesstail = NULL;
        ListNode* greaterhead = NULL, * greatertail = NULL;
        ListNode* cur = pHead, *next = pHead -> next;
        while (cur)
         {
            if(cur->val < x) 
            {
                if (lesstail == NULL) 
                {
                    cur -> next = NULL;
                    lesshead = lesstail = cur;
                } 
                else 
                {
                    cur -> next = NULL;
                    lesstail -> next = cur;
                    lesstail = cur;
                }
            } 
            else 
            {
                    if (greatertail == NULL)
                     {
                        cur -> next = NULL;
                        greaterhead = greatertail = cur;
                    }
                     else {
                        cur -> next = NULL;
                        greatertail -> next = cur;
                        greatertail = cur;
                    }
            }
                cur = next;
                if(cur) //如果不判断的话,最后cur走到最后一个结点的时候,next产生空指针问题。
                next = cur -> next;
            }

        if(lesshead == NULL) return greaterhead;//如果第一个链表为空,则直接返回第二个链表头指针
        lesstail -> next = greaterhead;
        return lesshead;
        }
};

带哨兵位的就相对简单一些:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/

#include <cstddef>

class Partition {
  public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        if(pHead == NULL) return NULL;
        if(pHead -> next == NULL) return pHead;
        ListNode * lesshead = (ListNode*)malloc(sizeof(ListNode));
        lesshead -> next = NULL;
        ListNode * greaterhead = (ListNode*)malloc(sizeof(ListNode));
        greaterhead -> next = NULL;
        ListNode * lesstail = lesshead, * greatertail = greaterhead,*cur = pHead,*next = cur->next;

        while(cur)
        {
             if(cur -> val < x)
             {
                cur -> next = NULL;
                lesstail -> next = cur;
                lesstail = cur;
             }
             else 
             {
                cur -> next = NULL;
                greatertail -> next = cur;
                greatertail = cur;
             }
             cur = next;
             if(cur)
             next = cur -> next;
        }

        lesstail -> next = greaterhead -> next;
       //把两个链表拼在一起的时候需要去掉第二个链表的头结点
        free(greaterhead);
        return lesshead->next;
       //返回的时候不能返回头结点的地址,因为头结点不存任何数据,所以要返回头结点指向的那个结点的地址。

        }
};

其中,还有一些需要规避的小问题,注释里都写到了。

分享一个小技巧:

因为做oj类的题目时,链表问题调试起来就会有些麻烦,还要用头插尾插方式进行构建链表样例

但是其实不用,一般这类题目放到我们的vs中的话,我们可以快速构建链表:

ListNode* a = (ListNode*)malloc(sizeof(ListNode));
    assert(a);
    ListNode* b = (ListNode*)malloc(sizeof(ListNode));
    assert(b);
    ListNode* c = (ListNode*)malloc(sizeof(ListNode));
    assert(c);
    ListNode* d = (ListNode*)malloc(sizeof(ListNode));
    assert(d);
    a->val = 0;
    b->val = 7;
    c->val = 2;
    d->val = 0;
    a->next = b;
    b->next = c;
    c->next = d;
    d->next = NULL;
    ListNode* plist = a;

SLPrint(partition(plist, 5));

这样就可以随心构建链表,然后进行调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/495604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之队列,实现队列的增删改查

目录 一、队列的定义 二、队列的实现 1.使用链表来实现队列 2.实现队列的接口 初始化队列 void QueueInit(Queue *pq) 队尾入队列 void QueuePush(Queue *pq,QDataType data) 队头出队列 void QueuePop(Queue *pq) 获取队列头部元素 QDataType QueueFront(Queue *pq) …

uni-app获取手机号-获取用户地理位置-根据位置获取经纬度跳转高德

一.获取手机号 1.获取手机号首先要先登录拿到code&#xff0c;用code去获取session_key 2.获取 code需要知道自己的AppID(小程序ID)和AppSecret(小程序密钥) 3.解密后得到手机号 登录微信公众平台拿到自己的AppID(小程序ID)和AppSecret(小程序密钥) 微信公众平台 获取sessio…

【Java EE 初阶】如何保证线程安全二

目录 1.线程不安全是什么&#xff1f; 2.线程不安全的成因 3.解决线程不安全之一Synchronized关键字&#xff08;监视器锁&#xff09; 1.Synchronized使用方法 2.锁对象是什么&#xff1f; ​3.锁对象的练习 4.Synchronized的特性 1.互斥性 2.刷新内存 3.可重入 5.总…

事务及分布式事务解决方案

基础概念 1.1.事务 事务可以看做是一次大的活动&#xff0c;它由不同的小活动组成&#xff0c;这些活动要么全部成功&#xff0c;要么全部失败。 1.2.本地事务 在计算机系统中&#xff0c;更多的是通过关系型数据库来控制事务&#xff0c;利用数据库本身的事务特性来实现&a…

SAP 从入门到放弃系列之批次追溯功能

首先执行MB57,建立批次追溯关系&#xff0c;并存储在CHVW表。根据情况选择要追溯的期间&#xff0c;在过账日期范围内填写。 不勾选‘基于清单显示’&#xff0c;为ALV显示结果 勾选‘基于清单显示’&#xff0c;为清单显示结果 执行MB56&#xff0c;查询批次追溯 可以设置显示…

【.NET AI Books 前言】Azure OpenAI Service 入门

本书是为 .NET 开发者而写的&#xff0c;让 .NET 开发者能快速掌握 Azure OpenAI Service 的使用技巧。 ChatGPT 的到来意味着我们已经置身于 AI 引起的全新变革中&#xff0c;作为开发者你可能将面临几种改变&#xff1a; GPT 模型到来后&#xff0c;如何去架构好企业解决方案…

Dex-Net 2.0<论文>

题目&#xff1a;Deep Learning to Plan Robust Grasps with Synthetic Point Clouds and Analytic Grasp 引言 传统抓取方法的局限性 缺乏泛化能力需要大量计算资源和手工标注数据【前两种依赖物体形状、材料、质量等先验知识通常要对物体建模姿态评估运动学分析】只能处理…

【C语言】深入理解注释

文章目录 一. 预处理阶段对注释的处理二. 注释使用时的注意事项1. C风格的注释无法嵌套使用2. 基本注释注意事项3. 注释导致的二义性 四. 关于注释的一个使用建议 一. 预处理阶段对注释的处理 我们知道一个源文件要变成可执行程序的话&#xff0c;首先要经过预处理&#xff0c…

Vtk7.1.1+PCL1.12.0安装

错误可参考&#xff1a;Ubuntu20.04 编译 pcl1.8可能出现的问题 安装参考1&#xff1a;ubuntu20.04下安装pcl_ubuntu安装pcl_Yuannau_jk的博客-CSDN博客 安装参考2&#xff1a;Ubuntu20.04 安装pcl详细教程_ubuntu20.04安装pcl_LYiiiiiii的博客-CSDN博客 安装参考3&#xff1a…

涨知识!你不知道的中国手机号码的编码和划分规则

引言 在当今信息化的时代&#xff0c;移动电话号码已经成为人们日常生活中必不可少的联系方式。中国作为世界上拥有庞大人口数量的国家之一&#xff0c;移动电话号码的编码和划分显得尤为重要。 中国的移动电话号码分为三大运营商&#xff0c;每个运营商又有自己的号码段&…

Spring Security OAuth2.0(三)-----基于Redis存储和JDBC存储

问题 令牌往哪里存&#xff1f; 客户端信息入库 第三方应用优化 1.令牌往哪里存&#xff1f; 在我们配置授权码模式的时候&#xff0c;有两个东西当时存在了内存中&#xff1a; InMemoryAuthorizationCodeServices 这个表授权码存在内存中。InMemoryTokenStore 表示生成的令…

open3D

一、说明 对于点云 处理&#xff0c;这里介绍哦pen3d&#xff0c;该软件和opencv同样是interl公司的产品。 Open3D 是一个开源库&#xff0c;支持快速开发处理 3D 数据的软件。 Open3D 前端在 C 和 Python 中公开了一组精心挑选的数据结构和算法。后端经过高度优化&#xff0c;…

Spring Boot处理CORS跨域请求的三种方法

1 前言 Springboot跨域问题&#xff0c;是当前主流web开发人员都绕不开的难题。但我们首先要明确以下几点 跨域只存在于浏览器端&#xff0c;不存在于安卓/ios/Node.js/python/ java等其它环境跨域请求能发出去&#xff0c;服务端能收到请求并正常返回结果&#xff0c;只是结…

05-权限分配 尚筹网

权限控制 权限控制机制的本质就是“用钥匙开锁”。 在实现权限控制之前&#xff0c;这里先完成给Admin分配Role和给Role分配Auth的功能。 一、给Admin分配Role 目标 ​ 通过前端页面操作&#xff0c;将Admin与Role之间的关系保存到数据库 思路 ​ 给下面的按钮&#xff…

【ED合集】事件检测的文章

1 CorED: Incorporating Type-level and Instance-level Correlationsfor Fine-grained Event Detection 论文来源&#xff1a;SIGIR 2022(CCF A类会议) 论文链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3477495.3531956 代码链接&#xff1a;GitHub - JiaweiSheng…

抖音小程序|基于天气API实现天气预报功能

文章目录 一、前言包含了功能UI展示 二、开发前的准备三、开发步骤1.app.js 配置2.pages/index.js 演示二维码源码在百度网盘下载 一、前言 参考老版iPhone自带的天气预报APP。目前只有一个界面UI, 后续会更新出更多功能; 包含了功能 - 实况预报 - 未来48小时 - 未来一周的天…

动态gif图片如何在线做?轻松实现图片在线生成gif

常见的jpg、png格式的静态图片想要变成gif格式的动态图片时&#xff0c;要怎么办呢&#xff1f;有没有什么简单实用的gif制作工具呢&#xff1f; 一、什么工具能够在线制作gif&#xff1f; GIF中文网作为一款专业的gif制作&#xff08;https://www.gif.cn/&#xff09;工具&a…

Golang - slice 内部实现原理解析

Golang - slice 内部实现原理解析 一.Go中的数组和slice的关系 1.数组 在几乎所有的计算机语言中&#xff0c;数组的实现都是一段连续的内存空间&#xff0c;Go语言数组的实现也是如此&#xff0c;但是Go语言中的数组和C语言中数组还是有所不同的 C语言数组变量是指向数组第…

鸿蒙Hi3861学习七-Huawei LiteOS(信号量)

一、简介 信号量&#xff08;Semaphore&#xff09;是一种实现任务间通信的机制&#xff0c;实现任务之间同步或临界资源的互斥访问。常用于协助一组相互竞争的任务来访问临界资源。 在多任务系统中&#xff0c;各任务之间需要同步或互斥实现临界资源的保护&#xff0c;信号量功…

阿里工作7年,肝到P8就靠这份学习笔记了,已助14个朋友拿到offer

​ 在阿里工作了7年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到P8也费了不少心思。 技术的更新迭代越来越快&#xff0c;程序员或许是这个过程中最为挣扎的一波人。每…