以给定值x为基准将单链表分割为两部分,所有小于x的结点都排在大于或等于x的结点之前。
#include "LinkList.cpp" //现单链表的各种基本运算的算法文件单链表的基本运算算法_yyy_zxc的博客-CSDN博客
void Split02(LinkNode *&L,ElemType x){
LinkNode *p=L->next; //p指针作为旧表的第一个结点,作用类似于头指针
LinkNode *s=p->next; //s指针永远指向p的下一个结点
LinkNode *r=L; //r指针指向新表的尾结点
LinkNode *n=L; //n记录第一个小于x结点的地址
L->next = NULL; //因为p指针已保存第一个结点地址,所以旧表数据不会丢失
//此时L指针指向空,相当于一个新表
while(p != NULL){
if(p->data < x){
p->next = L->next; //如果旧表p结点值小于x,则将其插入新表头结点后面
L->next = p;
if(p->next == NULL)
r=p; //如果p结点插入后为尾结点,则使r指向p
n=n->next;
}
else if(p->data > x){
p->next = r->next; //如果大于x则将其插入新表尾结点后面
r->next = p;
r = r->next;
}
else{ //如果等于x则将其插入第一个小于x结点的后面
p->next=n->next;
n->next=p;
}
p=s;
if(s != NULL) //判断p是否是最后一个结点
s=p->next;
}
}
int main(){
LinkNode *h;
ElemType b[]={1,2,1,3,6,3,8,5};
InitList(h); //初始化
ListInsertF(h,b,8); //建表
DispList(h); //输出表
Split02(h,3);
printf("--------------------------\n");
DispList(h); //输出表
DestoryList(h); //释放表
运行结果:
书上代码:
void Split01(LinkNode *&L,ElemType x){
LinkNode *p=L->next,*q,*r;
L->next=NULL;
r=L;
while(p != NULL){
if(p->data <x ){
q=p->next;
p->next=L->next;
L->next=p;
if(p->next == NULL)
r=p;
p=q;
}
else{
r->next=p;
r=p;
p=p->next;
}
}
r->next = NULL;
}
运行结果
书上的算法Split01存在一个bug,数据按顺序存储时x才作为分界点
Split02在书上代码的基础上,增加了一个对p->data ==x的判断,并将其插入第一个小于x的结点的后面
以给定值x为基准将单链表分割为两部分,所有小于x的结点都排在大于或等于x的结点之前。相关推荐
- 链表:链表分割问题:以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
链表分割: 以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前,注意:数据的顺序不改变. 代码实现: 链表的定义: typedef int SListDataType; t ...
- 以给定值x为基准将链表分割成两部分
分析: 题目要求将链表以x为基准分成两部分,但并不是真的将链表分成两个链表,同时在分割后,不能改变原先链表的顺序,具体分析步骤如下: 首先我们定义一个cur去遍历链表的每一个节点,找出所有小于x的结点 ...
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】...
[002-Add Two Numbers (单链表表示的两个数相加)] 原题 You are given two linked lists representing two non-negative ...
- TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
TypeScript数据结构与算法专题 - [单链表4] 单链表节点的`两-两`反转的实现 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 专题目录:https://blo ...
- 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂度应为 O(1),时 ...
- 单链表销毁的两种方式
单链表销毁的两种方式 在创建和新增申请单链表节点时,需要通过malloc函数手动申请内存空间.如果不对相应内存进行手动释放则会约积累越多,存在内存泄漏风险. 递归销毁 通过递归找到链表最后一个节点,依 ...
- 链表面试题2:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
我们可以,用两个新链表,一个存比基准值大的,另一个存比基准值小的.然后再拼接在一起. 用尾插的方法,首先说小的,创建两个指针,一个头,一个尾,再创建个指针跑链表,扫描每一个结点,如果里的值小,存入小链 ...
- 单链表-单链表拆分为两个线性表(尾插法+尾插法)
题意: 设C{a1,b1,a2.b2-an,bn}为一线性表,采用带头结点的单链表hc存放,设计一个就地算法,将其拆分为两个线性表,每个线性表均采用带头结点的单链表存储,使得: A = {a1,a2. ...
- C++头插法尾插法建立单链表,合并两个有序单链表
A和B是两个单链表(带表头结点),其中元素递增有序.设计一个算法,将A和B归 并成一个按元素值非递减有序的链表 C,C由A 和B 中的结点组成. #include<iostream> #i ...
最新文章
- 用贝叶斯定理解决三门问题并用Python进行模拟(Bayes' Rule Monty Hall Problem Simulation Python)...
- Metaphors for a richer understanding of software development -- Code complete reading notes(2)
- Linux中grep命令 常用选项
- 最重要的7个Drupal内核模板文件
- idea卸载不干净怎么办_fxfactory卸载不干净?Fxfactory及插件卸载教程
- java 多线程 notify_Java多线程8:wait()和notify()/notifyAll()
- 常用模块(json/pickle/shelve/XML)
- python多图合并成一张图_将现有的图形合并成一个图形PYTHON的pdf格式
- ios之JavaScript
- Abaqus DOC 搜索功能 在 IE浏览器 显示“应用程序已被JAVA安全阻止”解决办法
- PyCharm 实用快捷键
- IE浏览器下载文件中文文件名乱码问题解决
- MySQL基本架构示意图
- 糖友日常生活需要注意什么
- P1129 [ZJOI2007]矩阵游戏 (匈牙利算法)
- B站JavaScript从入门到精通智能社Blue石川老师视频部分代码_轮播图
- VSSDK 系列 - 创建 灯泡提示 ,替换 单词
- 44道javaScript变态题(上)
- 1660用哪个驱动稳定_3DS MAX哪个版本更稳定更好用?各个版本来分析
- 一个屌丝程序员的青春(八六)