无头结点单链表直接插入排序(王红梅分级抽象教学方法)

news2024/9/21 11:21:25
struct ListNode 
{
    int val;
    struct ListNode* next;
};

typedef struct ListNode ListNode;
struct ListNode* insertionSortList(struct ListNode* head)
{
    // 如果链表为空或者链表只有一个元素,那就根本不用排序
    if (head == NULL || head->next == NULL)
        return head;
    // 创建一个新链表sorthead ,sorthead指向有序区第一个节点
    // 把原链表的第一个节点取下来放到新链表
    ListNode* sorthead = head;
    ListNode* cur = head->next; // 让cur指向原链表第二个节点
    sorthead->next = NULL;

    //  然后cur遍历链表,让cur得val去和soryhead的val作对比,
    // 如果cur小于sorthead,那就是头插
    // 如果 cur == 或者大于的话 那就是中间插入或者尾插,
    // 那就在遍历sorthead链表,让sortcur去遍历,让sortcur得val值去和cur得val值作对比
    // 让sortprev指向sortcur得上一个指针 
    // 如果小于,就在 sortprev和sortcur之间插入 
    // 如果大于,那就让sortcur往后走,继续对比
    // 如果出了循环,就说明cur的值最大,那就尾插到sort链表中
    while (cur)//cur指向未排序节点的第一个(cur指向无序区)
    {
        ListNode* next = cur->next; // next指向cur得下一个节点

        // 将cur插入sort链表的同时保持有序
       // 如果cur小于sorthead,那就是头插
        if (cur->val <= sorthead->val)//第一个节点之前插入
        {
            // 头插到sorthead链表
            cur->next = sorthead;
            sorthead = cur;
        }
        else // 中间插入或者尾插
        {
           // 让sortprev指向sortcur得上一个指针
            ListNode* sortprev = sorthead; // 指向sortcur得前一个指针
            ListNode* sortcur = sorthead->next;

            while (sortcur)
            {
                if (cur->val <= sortcur->val)
                {
                    // 中间插入// 如果小于,就在 sortprev和sortcur之间插入 
                    sortprev->next = cur;
                    cur->next = sortcur;
                    break;
                }
                else
                {// 如果大于,那就让sortcur往后走,继续对比
                    // 让sortcur继续迭代,遍历链表
                    sortprev = sortcur;
                    sortcur = sortcur->next;
                }

            }

            // 走到这里可能是cur得val值大于sorthead中的任何一个值
            // 也可能是前面break出循环
            // 尾插到链表
          // 如果出了循环,就说明cur的值最大,那就尾插到sort链表中
            if (sortcur == NULL) // 判断是不是遍历完链表了
            {
                sortprev->next = cur;
                cur->next = NULL;
            }

        }
        cur = next;//指向无序区第一个节点
    }
    
    return sorthead;
}

注意:单独处理第一个节点插入和最后一个节点后插入

思路:

1首先将原链表的第一个节点head取消来当做新链表的头节点sorthead,然后让sorthead的next = NULL,让cur指向原链表的第二个节点。(注意了,要提前判断head和head->next是否为NULL)

 

2然后让cur的val去和sorthead的val去做比较,如果小于的话直接头插,大于的话就要中间插入或者尾插

3中间插入或者尾插需要分类讨论,让sortcur指向sorthead->next,让sortprev指向sortcur得上一个节点。让sortcur去和cur做对比,如果sortcur大那就让cur插入在sortprev和sortcur之间,小的话就让sortcur继续遍历sorthead链表,当sortcur= NULL的时候,就说明cur是最大的,要尾插到链表中

 

4最后返回sorthead

关于链式存储结构的:有头节点和无头结点单链表直接插入排序,

重点学习:分析问题,以及如何解决问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门基础知识45——【关于C++ 函数】定义函数、函数声明

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

海外广告投放成功的关键点有哪些?

在全球化日益加深的今天&#xff0c;海外广告投放已成为众多企业拓展国际市场、提升品牌影响力的关键手段。然而&#xff0c;面对不同文化、语言、消费习惯以及市场环境的挑战&#xff0c;如何确保海外广告投放的成功&#xff0c;是每一个跨境营销者面对的重大课题。本文将从多…

曹启富主任医师:高血压的罪魁祸首找到啦!原来是他变硬了

上周公司一年一度的体检&#xff0c;如同一场无声的健康大考&#xff0c;本以为不过是例行公事&#xff0c;走走过场&#xff0c;没想到却意外揭开了许多同事健康背后的隐忧。平日里自诩年轻力壮、身体倍儿棒的他们&#xff0c;体检报告上却赫然出现了多个警示灯&#xff0c;让…

开放式耳机是什么意思?开放式耳机好不好用?

开放式耳机是一种在设计上不会完全封闭或堵塞耳道的耳机类型 。其发声原理通常是通过空气传导和骨传导的组合&#xff0c;将声音传递到内耳&#xff0c;并刺激听觉神经产生听觉感受 。 优点&#xff1a; 佩戴舒适&#xff1a;通常采用轻盈的设计&#xff0c;不会直接刺激耳膜&…

心脑血管科曹启富主任医师:低压高的2大原因!年轻人血压高一定要看

在现代社会&#xff0c;不仅仅是中老年人&#xff0c;越来越多的年轻人也开始面临血压低压&#xff08;舒张压&#xff09;偏高的问题。这一现象往往被忽视&#xff0c;但其潜在的健康风险却不容忽视。了解低压高的原因&#xff0c;对于年轻人维护心血管健康至关重要。本文将深…

海外社交媒体引流策略及云手机的应用

在外贸电商领域&#xff0c;海外社交媒体引流已成为一种极为有效的营销手段。通过精准锁定目标受众&#xff0c;企业能够以较低成本获取大量流量&#xff0c;从而提高转化率。在这个过程中&#xff0c;云手机的应用也越来越受到重视。 首先&#xff0c;我们需要选择适合的海外社…

工作录屏工具选择全攻略:哪种录屏工具更得你心?

在如今这个信息爆炸的时代&#xff0c;电脑录屏工具已经成为我们工作中不可或缺的利器。无论是制作教程、演示操作还是记录重要时刻&#xff0c;一款好的录屏工具都能让我们的工作事半功倍。接下来&#xff0c;为大家推荐几款工作中常用的电脑录屏工具&#xff0c;并分享使用感…

Neo4j在Ubuntu 20.04上安装

rootnode11:~# cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE20.04 DISTRIB_CODENAMEfocal DISTRIB_DESCRIPTION"Ubuntu 20.04.6 LTS" rootnode11:~# cat /etc/issue Ubuntu 20.04.6 LTS \n \l 1.安装jdk java 1.8.xx版本对应neo4j 3.xx版本 jdk 11版本对…

CpK vs PpK,过程能力指标的精彩对决

Cpk VS Ppk&#xff08;一&#xff09;描述 对于Cpk和Ppk这两个概念&#xff0c;大家可能会有无数个疑问&#xff01;这两个指标我该看哪个&#xff1f;计算有什么差别……那么我们首先来看一下Minitab中对它们俩是怎么描述的。 大多数能力评估都可以分组为以下两种类别中的一…

区块链未来发展展望:机遇与挑战并存

前言 随着全球数字化进程的不断推进&#xff0c;区块链技术作为一种去中心化、安全性高、透明度强的分布式账本技术&#xff0c;正逐步融入各个领域并产生深远影响。近年来&#xff0c;区块链已经从初期的加密货币应用扩展到金融、供应链管理、医疗健康、物联网、能源等多个行…

位图(布隆过滤器)

bitset/bitmap 给40亿个不重复的无符号整数&#xff0c;没排过序。给1个无符号整数,如何快速判断一个数是否在这40亿个数中。 ​ #pragma once#include <vector> #include <string> #include <time.h>template<size_t N> class bitset { public:bitse…

实战docker第一天——windows安装docker,测试,并解决被墙办法

Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其所有依赖项打包在一个名为“容器”的单独环境中&#xff0c;从而确保应用程序在任何环境下都能一致地运行。以下是 Docker 的一些核心概念及其意义&#xff1a; 容器化&#xff1a;Docker 通过将应用程序及…

外卖霸王餐系统的运作流程及注意事项

霸王餐系统概述 一、系统组成 商家端发布霸王餐活动信息&#xff0c;包括菜品、时间、人数等。管理活动报名者信息。查看活动效果和用户反馈。用户端浏览和报名感兴趣的霸王餐活动。提交评价和反馈。管理后台审核商家和用户信息。监控活动流程和数据。 二、运作流程 1.商家…

去中心化网络:Web3如何颠覆传统互联网

在互联网的演进过程中&#xff0c;从最初的静态网页到交互式的Web2.0&#xff0c;技术的进步不断推动着网络的变革。而如今&#xff0c;Web3作为互联网的下一代技术&#xff0c;正以其去中心化的特性&#xff0c;逐步颠覆传统的互联网架构。本文将深入探讨Web3如何通过去中心化…

CH9114 USB转四串口替换FT4232H系列芯片

之前针对CH9101系列芯片替换FT232系列芯片型号发布了一系列文章&#xff0c;想必有需要的同学或工程师已经体验过替换的便捷之处了。早前CH系列芯片只发现有单串口型号的替换&#xff0c;4串口芯片苦于迟迟找不到替换型号&#xff0c;所幸今年和他们工程师聊天中获悉&#xff0…

【C语言必学知识点六】自定义类型——结构体

结构体 导读一、自定义类型二、结构体2.1 什么是结构体2.2 结构的声明2.2.1 构体的声明格式2.2.2 结构体的特殊声明 2.3 关键字typedef2.3.1 typedef的作用2.3.2 typedef的使用2.3.2 typedef在结构体中的应用 2.4 结构体变量的创建和初始化2.4.1 结构体变量创建的区别2.4.2 重命…

系统一执行systemctl就报错`No space left on device`,全部拿下

前言 在现代计算机系统中&#xff0c;存储空间似乎总是无尽的&#xff0c;但当你突然看到“No space left on device”的错误消息时&#xff0c;那种突然的焦虑感可不是开玩笑的。这就像是你在一个精心设计的房间里忽然发现最后一块空地也被填满了——这时候你会发现&#xff…

12kg级折叠翼巡飞无人飞行器技术详解

12kg级折叠翼巡飞无人飞行器&#xff08;以下简称“飞行器”&#xff09;是一种集高机动性、长续航、易于部署于一体的先进无人机系统。该飞行器设计巧妙&#xff0c;能够在复杂环境中灵活飞行&#xff0c;执行侦察、监测、目标跟踪、通信中继等多种任务。其独特的折叠翼设计大…

电路基础 ---- 电压源、电流源、受控电源

1 电压源 定义&#xff1a;两端电压总是保持定值&#xff0c;与流过它的电流无关 1.1 分析 对于如下电路&#xff1a; 当 R → 0 R\to 0 R→0&#xff08;短路&#xff09;时&#xff0c; i ∞ i\infty i∞&#xff08;会烧坏电压源&#xff09;当 R → ∞ R\to\infty R…

EPLAN中部件库的导入和使用方法

EPLAN中部件库的导入和使用方法 如下图所示,点击工具-----部件------管理, 在弹出的窗口中点击附加------导入, 找到自己需要导入的文件,后缀名为EDZ,点击打开, 如下图所示,勾选"更新已有数据集并添加新建数据集",点击确定, 如下图所示,正在导