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

牛客:链表分割算法详解

链表分割_牛客题霸_牛客网

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/#include <cstddef>
typedef struct ListNode ListNode;
class Partition {
public:ListNode* partition(ListNode* pHead, int x) {// 思路:创建两个临时链表,分别存储小于x和大于等于x的节点// 最后将两个链表连接起来// 定义两个哑头节点(简化边界处理)和对应的尾指针// lesshead/lesstail:存储所有小于x的节点// greaterhead/greatertail:存储所有大于等于x的节点ListNode *lesshead , *greaterhead;ListNode *lesstail , *greatertail;// 为哑节点分配内存lesshead = lesstail = (ListNode*)malloc(sizeof(ListNode));greaterhead = greatertail = (ListNode*)malloc(sizeof(ListNode));// 初始化哑节点的next指针为NULLlesshead->next = greaterhead->next = NULL;// 遍历原链表ListNode* cur = pHead;while(cur) {if(cur->val < x) {// 当前节点值小于x,加入到less链表lesstail->next = cur;    // 将当前节点链接到less链表尾部lesstail = lesstail->next;  // 更新less链表的尾指针} else {// 当前节点值大于等于x,加入到greater链表greatertail->next = cur;    // 将当前节点链接到greater链表尾部greatertail = greatertail->next;  // 更新greater链表的尾指针}cur = cur->next;  // 移动到下一个节点}// 将less链表的尾部与greater链表的头部连接lesstail->next = greaterhead->next;// 确保新链表的尾部为NULL,避免出现环greatertail->next = NULL;// 保存新链表的头节点(lesshead的下一个节点)ListNode* list = lesshead->next;// 释放哑节点的内存(避免内存泄漏)free(lesshead);free(greaterhead);return list;}
};/* 样例讲解:
假设输入链表为:1 -> 4 -> 3 -> 2 -> 5 -> 2,x = 3步骤1:初始化两个哑节点
lesshead(哑) -> NULL
greaterhead(哑) -> NULL步骤2:遍历原链表并分区
- 节点1(1 < 3):加入less链表lesshead -> 1 (lesstail指向1)greaterhead -> NULL- 节点4(4 ≥ 3):加入greater链表lesshead -> 1greaterhead -> 4 (greatertail指向4)- 节点3(3 ≥ 3):加入greater链表lesshead -> 1greaterhead -> 4 -> 3 (greatertail指向3)- 节点2(2 < 3):加入less链表lesshead -> 1 -> 2 (lesstail指向2)greaterhead -> 4 -> 3- 节点5(5 ≥ 3):加入greater链表lesshead -> 1 -> 2greaterhead -> 4 -> 3 -> 5 (greatertail指向5)- 节点2(2 < 3):加入less链表lesshead -> 1 -> 2 -> 2 (lesstail指向2)greaterhead -> 4 -> 3 -> 5步骤3:连接两个链表
less链表尾部(2) -> greater链表头部(4)
最终链表:1 -> 2 -> 2 -> 4 -> 3 -> 5步骤4:释放哑节点内存,返回结果链表
*/

http://www.dtcms.com/a/343262.html

相关文章:

  • Java设计模式-享元模式
  • FreeRTOS学习笔记(三)--汇编指令
  • C ++代码学习笔记(一)
  • Layui 中的 iframe 详解与最佳实践
  • Linux笔记7——shell编程基础-1
  • SMT车间如何通过防静电监控系统提升产品质量
  • 206.反转链表
  • 【时时三省】vectorCAST 便捷使用技巧
  • 利用 Python 爬虫获取淘宝商品评论实战指南
  • 并发编程原理与实战(二十五)手写简易线程池实战,剖析线程状态转换过程
  • 【LINUX网络】UDP协议基础原理
  • Netty AdaptiveRecvByteBufAllocator原理详解
  • 分布式消息队列技术(原理相关):Kafka
  • 机器学习3
  • 《WINDOWS 环境下32位汇编语言程序设计》第6章 定时器和Windows时间
  • Git 版本控制核心流程与协作指南(从入门到冲突解决)
  • windows下jdk环境切换为jdk17后,临时需要jdk1.8的处理
  • 机器学习笔试题
  • 如何利用淘宝API接口实现自动下单?实战案例讲解
  • 【无标题】GAP: 用文本指导对任何点云进行高斯化(ICCV 2025)
  • 香港云服务器被暴力破解的危害有多大?
  • 使用docker manifest制作本地多架构镜像
  • Java与Vue深度融合,构建资产设备全周期管理系统,集成移动端实时操作与后台智能管理,功能完备且附完整源码,助力企业实现资产数字化高效运维
  • ChatBI如何重塑企业数据分析?2025年智能BI行业趋势解读
  • 使用 TensorBoardX 实现 PyTorch 神经网络可视化:从入门到进阶
  • Chrome 插件开发实战:从入门到进阶
  • Python 面向对象编程入门:从思想到属性操作
  • PyTorch 环境配置
  • Telnet、ftp详解
  • 教育场景下禁用html5播放器拖动进度条的例子