当前位置: 首页 > article >正文

链表分割-双哨兵位

题目

现有一链表的头指针struct ListNode* pHead,给一定值x,编写一段代码将所有小于x的节点排在其余节点之前,且不能改变原来数据顺序,返回重新排列后的链表的头指针

示例:
pHead [1,5,2,7,3,4], x=5
输出 [1,2,3,4,5,7]

struct ListNode {
    int val;
    struct ListNode* next;
};

struct ListNode* partition(struct ListNode* pHead, int x) {}

分析

思路:
创建两个新链表,分别存储小于x的节点和大于等于x的节点。将两个新链表链接起来成为新链表,返回新链表。
流程:
注:(great->g; less->l)
创建两个哨兵位,用gGuard和lGuard指向。创建gTail和lTail指向大小链表尾。
创建cur指针遍历原链表,当cur->val<x时尾插到lTail->next;否则尾插到gTail->next。
最后pHead指针存储新链表头,链接大小链表(lTail->next = gGuard->next;),再将新链表结尾指向NULL(gTail->next = NULL;)。
释放哨兵位。
返回pHead。

代码

struct ListNode {
    int val;
    struct ListNode* next;
};

struct ListNode* partition(struct ListNode* pHead, int x) {
    struct ListNode* gGuard, * gTail, * lGuard, * lTail;
    gGuard = gTail = (struct ListNode*)malloc(sizeof(struct ListNode));//创建哨兵位
    lGuard = lTail = (struct ListNode*)malloc(sizeof(struct ListNode));//创建哨兵位
    gTail->next = lTail->next = NULL;

    struct ListNode* cur = pHead;
    while (cur)
    {
        if (cur->val < x)
        {
            lTail->next = cur;
            lTail = lTail->next;
        }
        else
        {
            gTail->next = cur;
            gTail = gTail->next;
        }
        cur = cur->next;
    }
    gTail->next = NULL;
    lTail->next = gGuard->next;
    pHead = lGuard->next;
    free(gGuard);
    free(lGuard);
    return pHead;
}

本题若使用不带头单链表,会遇到很为NULL的情况,使用哨兵位可以避免这个问题。


http://www.kler.cn/a/542862.html

相关文章:

  • 网络工程师 (29)CSMA/CD协议
  • 如何通过腾讯 ima.copilot 训练自己的知识库
  • 计算机毕业设计SpringBoot校园二手交易小程序 校园二手交易平台(websocket消息推送+云存储+双端+数据统计)(源码+文档+运行视频+讲解视频)
  • 寒假2.8
  • arcgis界址点编号工具开发原理(西北角顺时针)
  • 为什么推荐使用 LabVIEW 开发
  • Python 查看各个库的版本
  • DotNet5在Docker中连接SqlServer2012,报错最大池超出
  • 【数据迁移】- Oracle GoldenGate(OGG)
  • 设计模式中的关联和依赖区别
  • ASP.NET Core 外部向SignalR的Hub发消息
  • MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32
  • 3.4 学习UVM中的uvm_monitor类分为几步?
  • 【论文笔记】Are Self-Attentions Effective for Time Series Forecasting? (NeurIPS 2024)
  • 移植BOA服务器到GEC2440开发板
  • 图解72个机器学习基础知识点
  • Flink怎么保证Exactly - Once 语义
  • 大型语言模型(LLM)中的自适应推理预算管理:基于约束策略优化的解决方案
  • 人工智能与低代码如何重新定义企业数字化转型?
  • Windows11系统笔记本电脑真的关机了么
  • Ubuntu指令学习(个人记录、偶尔更新)
  • 利用爬虫获取1688商品详情的实战案例指南
  • android的Jetpack简介
  • JavaScript系列(70)--响应式编程进阶详解
  • 机器学习-使用大规模的平行语料
  • mysql学习笔记-锁