当前位置: 首页 > 编程日记 > 正文

C语言的单链表分割

已知链表头指针head与数值x,将所有小于x的节点放在大于或等于x 的节点前,且保持这些节点的原来的相对位置。
在这里插入图片描述
这个过程有点类似于快速排序,寻找一个阈值,比该阈值小的放左边,比该阈值大的放右边。只是由数组遍历变为来链表遍历,操作变成了指针的指向。

具体步骤如下:

  1. 创建一个less_ptr,负责对less端的链表进行维护
  2. 创建一个more_ptr,负责对more端的链表进行维护
  3. 最终进行less的尾和more的头进行合并,返回头节点。

这个过程需要注意保存less端和more端的头节点,算法实现如下

Data *part_list(Data *head, int n) {Data less_head;Data more_head;less_head.data = 0;less_head.next = NULL;more_head.data = 0;more_head.next = NULL;Data *less_ptr = &less_head;Data *more_ptr = &more_head;/*遍历链表,将大于n的放在右端,小于等于n的放在左端*/while(head) {if(head->data > n){more_ptr->next = head;more_ptr = head;} else {less_ptr->next = head;less_ptr = head;}head = head->next;}/*连接小端的尾和大端的头,并将大端的尾置空*/less_ptr->next = more_head.next;more_ptr->next = NULL;/*返回小端的头,因为此时它是链表的表头*/return less_head.next;
}

源代码测试如下:

#include <stdio.h>
#include <stdlib.h>typedef struct Link_list
{/* data */int data;struct Link_list *next;
}Data;/*打印链表*/
void print_list(Data *head) {while (head) {printf("%d ",head->data);head = head -> next;}printf("\n");
}/*尾插法创建链表*/
Data *insert_tail(Data *head, int n) {head = (Data *)malloc(sizeof(Data));head->next = NULL;Data *r = head;int b;while(n--){scanf("%d",&b);Data *p = (Data *)malloc(sizeof(Data));p->data = b;r->next = p;p->next = NULL;r = p;}return head;
}/*分割链表*/
Data *part_list(Data *head, int n) {Data less_head;Data more_head;less_head.data = 0;less_head.next = NULL;more_head.data = 0;more_head.next = NULL;Data *less_ptr = &less_head;Data *more_ptr = &more_head;while(head) {if(head->data > n){more_ptr->next = head;more_ptr = head;} else {less_ptr->next = head;less_ptr = head;}head = head->next;}less_ptr->next = more_head.next;more_ptr->next = NULL;return less_head.next;
}int main(){Data *head;int i ,b ;printf("construct link list :\n");head = insert_tail(head,5);Data *test = head -> next;print_list(test);printf("after part list :\n");/*设置3为阈值,大于3的都放在右端,小于等于3的都放在左端*/Data *part = part_list(head->next,3);print_list(part);return 0;
}

输出如下:

construct link list :
5 4 3 2 1
5 4 3 2 1 
after part list :
3 2 1 5 4 

相关文章:

java面试时候算法题多吗_java程序员面试中最容易被问到的18个算法题(附答案!)...

作者&#xff1a;cpp软件架构狮链接&#xff1a;https://www.toutiao.com/i6618515311836529156/(点击阅读原文前去围观)算法是比较复杂又基础的学科&#xff0c;每个学编程的人都会学习大量的算法。而根据统计&#xff0c;以下这18个问题是面试中最容易遇到的&#xff0c;本文…

Ubantu Mark

说明&#xff1a;由于图形化界面方法&#xff08;如Add/Remove... 和Synaptic Package Manageer&#xff09;比较简单&#xff0c;所以这里主要总结在终端通过命令行方式进行的软件包安装、卸载和删除的方法。 一、Ubuntu中软件安装方法 1、APT方式 &#xff08;1&#xff09;普…

Linux挂载Windows共享目录

手工挂载&#xff1a; mount -t cifs -o usernameXXX,passwordXXX //IP/共享目录 /挂载目录 自动挂载&#xff1a; 在etc/fstab加入 //IP/共享目录 /挂载目录 cifs defaults,auto,usernameXXX,passwordXXX 0 0 重启转载于:https://blog.51cto.com/kenzhuang/1149033

搭建私有npm私库(使用verdaccio)

一、为什么要搭建npm私库 原因:1&#xff09;公司内部开发的私有包&#xff0c;统一管理&#xff0c;方便开发和使用&#xff1b;2&#xff09;安全性&#xff0c;由于公司内部开发的模块和一些内容并不希望其他无关人员能够看到&#xff0c;但是又希望内部能方便使用&#xff…

C语言的有序单链表合并

已知两个已排序链表头节点指针headA与headB&#xff0c;将这两个链表合并&#xff0c;合并后仍为 有序的&#xff0c;返回合并后的头节点。 主要步骤如下&#xff1a; 创建一个临时的头节点&#xff0c;头节点每次指向headA 或者 headB较小的节点当headA->data 比headB-&g…

我的世界java版双海底神殿种子_我的世界海底神殿种子2021

游戏我的世界中&#xff0c;2021年的海底神殿地图中有五种类型的种子可以使用&#xff0c;建议在找海底神殿时使用夜视药水。那么2021年在MC中最新的海底神殿种子分别是Seed&#xff1a;-1005362104&#xff0c;Seed&#xff1a;-1436927780&#xff0c;Seed&#xff1a;-10053…

Erlang服务端开发(无需Erlang基础)笔试题

某游戏公司Erlang服务端开发&#xff08;无需Erlang基础&#xff09;笔试题&#xff0c;面向C/C程序员 一、用你熟悉的语言解决下面的问题。 1、反转输出字符串&#xff0c;并移除其中的空格。 2、快速的判断一个数是否素数的方法。 3、给一个数组进行排序。 4、设计一个背包系…

几何匹配和分合算法的图像识别技术

第一章 引言 1.1 面像定位概述及其与面像识别的关系 这个设计所涉及到的是面像的定位和识别。简单来说&#xff0c;所谓面像的定位&#xff0c;就是在照片(静态图像)或视频(动态图像)中标出面像所在的位置&#xff0c;把面像选取出来。而面像的识别就是把选取出来的面像与…

RegExp 正则

正则&#xff1a;就是一条规则&#xff0c;用于检验字符串的格式&#xff0c;目标就是字符串。 只要是表单提交的数据都是字符串 正则的定义&#xff1a; 1.var regnew RegExp()&#xff1b; 2.var reg/格式/&#xff1b; 正则的方法&#xff1a; 两个功能&#xff0c;一个是匹…

C++的多个有序链表合并

已知k个已排序链表头节点指针&#xff0c;将这k个链表合并&#xff0c;合并后仍为有序的 &#xff0c;返回合并后的头节点 如下三个链表&#xff1a; 合并后的结果如下&#xff1a; 方法一&#xff08;STL sort算法进行排序&#xff09;&#xff1a; 先将输入的排序链表插入…

c# 垃圾回收是引用类型而言的

c# 垃圾回收是引用类型而言的转载于:https://www.cnblogs.com/C-CHERS/p/3646387.html

java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)

具有无限参数的Java方法(Java method with unlimited arguments)Spring框架使用方法&#xff0c;您可以根据需要传递尽可能多的参数。我想写一个函数&#xff0c;也可以采取无限量的数据。 这个功能是如何调用的&#xff0c;以便我可以阅读它。 或者我该如何定义它&#xff1f;…

2013-3-10日记

2019独角兽企业重金招聘Python工程师标准>>> 今天星期日&#xff0c;在家早上看NBA&#xff0c;中午去买菜&#xff0c;下午在家种花&#xff0c;晚上看CBA。 转载于:https://my.oschina.net/guanyun/blog/112801

P1522 牛的旅行

这题挺好……有几个坑……&#xff08;反正我都跳进去了&#xff09; 对于新的更大的图&#xff0c;由于求的是最小连接边&#xff0c;所以它的值可能小于之前单独一个图的最长的最短路…… 所以之后的值应该取个max&#xff08;emmm……&#xff09; 所以第一次我只拿了70。。…

C++ algorithm的sort函数总结

sort函数 sort对给定区间进行排序&#xff0c;支持各种数据类型&#xff0c;迭代器&#xff0c;结构体&#xff0c;自定义排序规则stable_sort 对给定区间进行稳定排序,且可保证相等元素的原本相对次序在排序后保持不变partial_sort 对给定区间部分元素排序partial_sort_copy …

加密解密php,PHP实现的加密解密处理类

本文实例讲述了PHP实现的加密解密处理类。分享给大家供大家参考&#xff0c;具体如下&#xff1a;/* 版权协议&#xff1a; GPL (The GNU GENERAL PUBLIC LICENSE Version 2, June 1991)------------------------------------------------------------ 文件名称&#xff1a;cls…

技术人生:本周改进计划

分配时间学习领域知识和管理知识。更慎重的命名。注意交流的态度和方式&#xff08;特别是在出现不同意见的时候&#xff09;。对待任何工作内容都不能应付了事。转载于:https://www.cnblogs.com/happyframework/p/3695596.html

linux下batik-rasterizer.jar生成图片中文乱码

为什么80%的码农都做不了架构师&#xff1f;>>> 发现原来jdk5.0在linux下和以前的版本还不一样&#xff0c;默认不支持中文字体的。得手动去搞一个fontconfig配置&#xff0c; 此文件在$JAVA_HOME/jre/lib/下&#xff0c; 果然有一大堆fontconfig.XX.properties, 官…

小记,springboot项目中自己常用的logback配置文件

把配置文件放到resources这个classpath目录即可生效&#xff0c;日志输入样式是从springboot中日志配置中copy过来的, 其他常用配置不做过多注释了。 logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <configuration><conversi…

s-sar命令(System Activity Reporter系统活动情况报告)

文章目录前言语法格式查看CPU使用情况保存统计结果到文件中查看磁盘平均负载和队列长度查看内存使用情况查看系统swap分区情况查看IO和传递速率查看磁盘使用情况输出inode、文件和其他内核表的信息统计网络信息查看网络接口信息网络设备通信失败信息统计socket连接信息TCP连接的…

基础设计模式:单例模式+工厂模式+注册树模式

单例模式&#xff1a; 通过提供自身共享实例的访问&#xff0c;单例设计模式用于限制特定对象只能被创建一次。 使用场景&#xff1a; 一般数据库实例都会用单例模式 实现&#xff1a; 单例设计模式就是要一个类只能实例化一个对象。 要想让一个类只能实例化一个对象&#xff0…

mac 配置 php,mac如何配置php环境

一、启动Apache两种方法1、打开网络共享打开"系统偏好设置"->"共享"&#xff0c;在"互联网共享"那一项前面打√。2、打开终端&#xff0c;输入sudo apachectl start这时需要输入密码&#xff0c;输入电脑密码即可,然后输入sudo apachectl &am…

LinkedBlockingQueue应用实例

并发库中的BlockingQueue是一个比较好玩的类&#xff0c;顾名思义&#xff0c;就是阻塞队列。该类主要提供了两个方法put()和take()&#xff0c;前者将一个对象放到队列中&#xff0c;如果队列已经满了&#xff0c;就等待直到有空闲节点&#xff1b;后者从head取一个对象&#…

s-stat 查看文件或者文件系统的状态信息

命令用法 stat [OPTION]... FILE... -L 查看链接文件-f 查看文件系统信息&#xff0c;而非文件信息-c --format%a 支持使用格式化字符串输出结果&#xff0c;支持\n,\t等转义字符,详细格式化情况使用man stat查看--printfFORMAT 支持格式化输出-t 以简洁的方式输出结果 常用…

梦想的地方!地球上最值得去的20个地方【组图】

如果你是一个热爱大自然的人你肯定会喜欢这个集合。地球上有太多的地方和风景值得我们这辈子至少要去看一次。大多数自然摄影师喜欢没有人出现在他们的照片中&#xff0c;他们想获得纯净、完美的风景&#xff0c;没有人类的影响。这篇文章展示了20个地球上最惊人的地方的照片&a…

php读取js验证码,PHP + JS 实现验证码功能

验证码是网站防止恶意攻击最常用的手段&#xff0c;怎样使用PHP来生成验证码呢&#xff0c;下面就直接上例子首先给出生成验证码的PHP代码&#xff1a;将上面的代码放在一个单独的php文件中&#xff0c;如&#xff1a;auth_code.php&#xff0c;最好不要讲验证码的代码放到其他…

poj1692

题意&#xff1a;两个数列&#xff0c;第一行的数字可以和第二行的数字连线。连线有如下条件&#xff0c;被连上的两数字必须相等&#xff0c;且每个数字只能连一条线&#xff0c;每条连线必须与且仅与另一条连线相交&#xff0c;相交两连线上的数字不能相等。问最多能连多少条…

MongoDB 学习使用

博客教程&#xff1a; https://jingyan.baidu.com/article/dca1fa6f0428a4f1a440522e.html转载于:https://www.cnblogs.com/harlem/p/10148315.html

C语言的双向链表头插法和尾插法,指定节点删除

文章目录前言头插法尾插法删除节点测试代码如下前言 双向链表和单链表的唯一区别就是多个一个指针域而已&#xff0c;该指针域可以访问链表的上一个节点。 关于构造双向链表的过程我们常见的有两种方法&#xff0c;和单链表一样&#xff1a;头插法和尾插法。 头插法&#xff…

机房收费系统之uml图——初版

说起uml图&#xff0c;在我心中最难的当属类图无疑。虽然敲了三层的小例子&#xff0c;但真正让把三层和uml图结合起来&#xff0c;并且还要考虑设计模式的时候&#xff0c;总是让人有一种无从下手的感觉&#xff0c;不过还好&#xff0c;通过这半个多月的思考与探索&#xff0…