#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的结点之前。相关推荐

  1. 链表:链表分割问题:以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

    链表分割: 以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前,注意:数据的顺序不改变. 代码实现: 链表的定义: typedef int SListDataType; t ...

  2. 以给定值x为基准将链表分割成两部分

    分析: 题目要求将链表以x为基准分成两部分,但并不是真的将链表分成两个链表,同时在分割后,不能改变原先链表的顺序,具体分析步骤如下: 首先我们定义一个cur去遍历链表的每一个节点,找出所有小于x的结点 ...

  3. 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】...

    [002-Add Two Numbers (单链表表示的两个数相加)] 原题 You are given two linked lists representing two non-negative ...

  4. TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)

    TypeScript数据结构与算法专题 - [单链表4] 单链表节点的`两-两`反转的实现 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 专题目录:https://blo ...

  5. 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

    给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂度应为 O(1),时 ...

  6. 单链表销毁的两种方式

    单链表销毁的两种方式 在创建和新增申请单链表节点时,需要通过malloc函数手动申请内存空间.如果不对相应内存进行手动释放则会约积累越多,存在内存泄漏风险. 递归销毁 通过递归找到链表最后一个节点,依 ...

  7. 链表面试题2:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

    我们可以,用两个新链表,一个存比基准值大的,另一个存比基准值小的.然后再拼接在一起. 用尾插的方法,首先说小的,创建两个指针,一个头,一个尾,再创建个指针跑链表,扫描每一个结点,如果里的值小,存入小链 ...

  8. 单链表-单链表拆分为两个线性表(尾插法+尾插法)

    题意: 设C{a1,b1,a2.b2-an,bn}为一线性表,采用带头结点的单链表hc存放,设计一个就地算法,将其拆分为两个线性表,每个线性表均采用带头结点的单链表存储,使得: A = {a1,a2. ...

  9. C++头插法尾插法建立单链表,合并两个有序单链表

    A和B是两个单链表(带表头结点),其中元素递增有序.设计一个算法,将A和B归 并成一个按元素值非递减有序的链表 C,C由A 和B 中的结点组成. #include<iostream> #i ...

最新文章

  1. 用贝叶斯定理解决三门问题并用Python进行模拟(Bayes' Rule Monty Hall Problem Simulation Python)...
  2. Metaphors for a richer understanding of software development -- Code complete reading notes(2)
  3. Linux中grep命令 常用选项
  4. 最重要的7个Drupal内核模板文件
  5. idea卸载不干净怎么办_fxfactory卸载不干净?Fxfactory及插件卸载教程
  6. java 多线程 notify_Java多线程8:wait()和notify()/notifyAll()
  7. 常用模块(json/pickle/shelve/XML)
  8. python多图合并成一张图_将现有的图形合并成一个图形PYTHON的pdf格式
  9. ios之JavaScript
  10. Abaqus DOC 搜索功能 在 IE浏览器 显示“应用程序已被JAVA安全阻止”解决办法
  11. PyCharm 实用快捷键
  12. IE浏览器下载文件中文文件名乱码问题解决
  13. MySQL基本架构示意图
  14. 糖友日常生活需要注意什么
  15. P1129 [ZJOI2007]矩阵游戏 (匈牙利算法)
  16. B站JavaScript从入门到精通智能社Blue石川老师视频部分代码_轮播图
  17. VSSDK 系列 - 创建 灯泡提示 ,替换 单词
  18. 44道javaScript变态题(上)
  19. 1660用哪个驱动稳定_3DS MAX哪个版本更稳定更好用?各个版本来分析
  20. 一个屌丝程序员的青春(八六)

热门文章

  1. 好工作需要这么多而充足的准备,你还在浪费时间吗 行动吧?
  2. 快捷键关闭c语言程序,C语言:VS环境下的程序快捷键大全以及Windows快捷键命令...
  3. Leetcode-111 二叉树的最小深度(递归)
  4. Linux gzip/gunzip压缩解压
  5. win10系统用hexo+GitHub搭建博客遇到的坑
  6. 短视频如何选题?三个方法来帮忙,帮你避免江郎才尽
  7. tvb与亚视的十部巅峰代表作,论经典程度谁更胜一筹
  8. 用MATLAB给图片打马赛克
  9. App程序上传流程图
  10. react项目里如何使用阿里字体图标