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

数据结构 ——— 单链表oj题:链表分割(带哨兵位单向不循环链表实现)

目录

题目要求

手搓简易单链表

代码实现 


题目要求

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

举例说明:

输入:x = 5 ; [1,3,9,6,5,4,7,2]

输出:[1,3,4,2,9,6,5,7]


手搓简易单链表

代码演示:

struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n1);
struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n2);
struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n3);
struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n4);
struct ListNode* n5 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n5);
struct ListNode* n6 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n6);
struct ListNode* n7 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n7);
struct ListNode* n8 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n8);n1->val = 1;
n2->val = 3;
n3->val = 9;
n4->val = 6;
n5->val = 5;
n6->val = 4;
n7->val = 7;
n8->val = 2;n1->next = n2;
n2->next = n3;
n3->next = n4;
n4->next = n5;
n5->next = n6;
n6->next = n7;
n7->next = n8;
n8->next = NULL;

代码实现

代码演示:

struct ListNode* partition(struct ListNode* head, int x)
{// 小于 x 的头尾节点struct ListNode* lesshead;struct ListNode* lesstail;// 大于等于 x 的头尾节点struct ListNode* greaterhead;struct ListNode* greatertail;// 定义哨兵位lesshead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));greaterhead = greatertail = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur = head;while (cur != NULL){if (cur->val < x){lesstail->next = cur;lesstail = lesstail->next;}else{greatertail->next = cur;greatertail = greatertail->next;}cur = cur->next;}// 链接两个链表lesstail->next = greaterhead->next;greatertail->next = NULL;head = lesshead->next;free(lesshead);free(greaterhead);return head;
}

代码解析:

代码思路:创建两个带哨兵位的单链表,一个用来链接小于 x 的节点,一个用来链接大于等于 x 的节点,最后再把两个链表进行链接,这样就完成了链表的分割,并且没有改变原来的数据顺序

代码逻辑:lesshead 和 lesstail 用来管控小于 x 的节点,lesshead 是哨兵位,不存储有效数据,lesstail 向后链接小于 x 的节点,greaterhead 和 greatertail 作用同上,是用来链接大于等于 x 的节点,进行分割后,不要忘记将 greatertail 的 next 置空,因为分割后 greatertail 节点不一定是为节点,最后再将 lesshead 哨兵位的 next 赋值给 head ,再释放,即可

代码验证:

算法的时间和空间复杂度:

while 循环执行了 N 次,每次内部常数次,只 malloc 开辟了两个节点,可忽略不计

算法的时间复杂度:O(N)

算法的空间复杂度:O(1)

http://www.lryc.cn/news/453534.html

相关文章:

  • 华为 HCIP-Datacom H12-821 题库 (32)
  • [C++][第三方库][brpc]详细讲解
  • Python-Learning
  • 如何让 Android 的前端页面像 iOS 一样“优雅”?
  • 10.3学习
  • Shell文本处理(三)
  • 5个python多线程简单示例
  • Streamlit:用Python快速构建交互式Web应用
  • 深入浅出Vue.js组件开发:从基础到高级技巧
  • Python并发编程挑战与解决方案
  • LeetCode从入门到超凡(五)深入浅出---位运算
  • 一些 Go Web 开发笔记
  • [Go语言快速上手]初识Go语言
  • 基于STM32的智能风扇控制系统设计
  • OpenCV 形态学相关函数详解及用法示例
  • Kafka学习笔记(三)Kafka分区和副本机制、自定义分区、消费者指定分区
  • 华为 HCIP-Datacom H12-821 题库 (31)
  • 占位,凑满减
  • SpringBoot校园资料平台:从零到一的构建过程
  • czx前端
  • Perforce演讲回顾(上):从UE项目Project Titan,看Helix Core在大型游戏开发中的版本控制与集成使用策略
  • 【含文档】基于Springboot+Andriod的成人教育APP(含源码+数据库+lw)
  • CentOS7系统配置Yum环境
  • pyqt打包成exe相关流程
  • 设计模式、系统设计 record part02
  • github双重验证(2FA)启用方法
  • 《Linux从小白到高手》理论篇:Linux的系统服务管理
  • SQL中如何进行 ‘’撤销‘’ 操作-详解
  • Hadoop之WordCount测试
  • Vue和axios零基础学习