数据结构---单链表(常见的复杂操作)

news2024/12/27 6:28:43

目录

一、单链表

1.1.查找中间元素

 1.2.查找倒数第K个节点

 1.3.链表倒置

 1.4.冒泡排序

 1.5.选择排序

1.6.环,确认有环单链表的环入口和环大小

二、总结


一、单链表

1.1.查找中间元素

        定义两个指针,分别指向第一个元素,第一个指针每次向后遍历两个节点,第二个指针向后遍历一个节点,最终当第一个指针遍历到最后一个时,第二个也就刚好指向中间节点。

LinkList *FindMidLinkList(LinkList *phead)
{
    LinkList *pfast = NULL;
    LinkList *pslow = NULL;
    if (phead->pnext == NULL)
    {
        return NULL;
    }

    pfast = pslow = phead->pnext;
    while (pfast != NULL)
    {
        pfast = pfast->pnext;
        if (NULL == pfast)
        {
            break;
        }
        pfast = pfast->pnext;
        if (NULL == pslow)
        {
            break;
        }

        pslow = pslow->pnext;
    }

    return pslow;

}

 1.2.查找倒数第K个节点

           定义两个指针,分别指向头节点,先让第一个指针向后遍历k次,让两个指针之间相差k个位置,然后让他们一起向后遍历,直到第一个指针指向最后一个节点,此时第二个指针就指向倒数第k个位置。

LinkList *FindTailKLinkList(LinkList *phead, int k)
{   
    LinkList *pfast = NULL;
    LinkList *pslow = NULL;

    if (phead->pnext == NULL)
    {
        return NULL;
    }

    pfast = phead;
    pslow = phead;

    for (int i = 0; i < k; i++)
    {
        pfast = pfast->pnext;
        if (pfast == NULL)
        {
            break;
        }
    }

    if (pfast == NULL)
    {
        return phead;
    }

    while (pfast != NULL)
    {
        pfast = pfast->pnext;
        pslow = pslow->pnext;
    }

    return pslow;

}

 1.3.链表倒置

        将链表的数据链与头节点分开,然后依次头插法插入头节点后面,完成倒置 

int HeadInvertLinkList(LinkList *phead)
{
    LinkList *ptmp = NULL;
    LinkList *qtmp = NULL;

    ptmp = phead->pnext;
    phead->pnext = NULL;
    qtmp = ptmp;

    while(qtmp != NULL)
    {
        qtmp = qtmp->pnext;
        ptmp->pnext = phead->pnext;
        phead->pnext = ptmp;
        ptmp = qtmp;
    }


    return 0;
}

 1.4.冒泡排序

int BulleSortLinkList(LinkList *phead)
{
    LinkList *ptmp1 = NULL;
    LinkList *ptmp2 = NULL;
    LinkList *qtmp = NULL;

    DataType data = 0;

    //链表只有头节点或只有一个数据节点,不需要排序
    if (phead->pnext == NULL || phead->pnext->pnext == NULL)
    {
        return 0;
    }

    ptmp1 = phead->pnext;
    ptmp2 = phead->pnext->pnext;

    

    while (1)
    {
        ptmp1 = phead->pnext;
        ptmp2 = phead->pnext->pnext;


        if (ptmp2 == qtmp)
        {
            break;
        }

        while (ptmp2 != qtmp)
        {
            if (ptmp1->data < ptmp2->data)
            {
                data = ptmp1->data;
                ptmp1->data = ptmp2->data;
                ptmp2->data = data;
            }
            ptmp1 = ptmp1->pnext;
            ptmp2 = ptmp2->pnext;
        }
        qtmp = ptmp1;


    }

    return 0;

}

 1.5.选择排序

int SelectSortLinkList(LinkList *phead)
{
    LinkList *ptmp1 = NULL;
    LinkList *ptmp2 = NULL;
    LinkList *qtmp = NULL;
    DataType data = 0;

     //链表只有头节点或只有一个数据节点,不需要排序
    if (phead->pnext == NULL || phead->pnext->pnext == NULL)
    {
        return 0;
    }

    qtmp = phead->pnext;

    while (qtmp->pnext != NULL)
    {
        ptmp1 = qtmp;
        ptmp2 = qtmp->pnext;

        while(ptmp2 != NULL)
        {
            if (ptmp2->data < ptmp1->data)
            {
                ptmp1 = ptmp2;
            }
            ptmp2 = ptmp2->pnext;
        }

        if (ptmp1 != qtmp)
        {
            data = ptmp1->data;
            ptmp1->data = qtmp->data;
            qtmp->data = data;
        }

        qtmp = qtmp->pnext;
    }

}

1.6.环,确认有环单链表的环入口和环大小

 

          定义两个指针,分别指向第一个元素,第一个指针每次向后遍历两个节点,第二个指针向后遍历一个节点,可以保证两个指针的差程自然数增长,这样两个指针终会在环里相遇。

LinkNode *IsHasCircle(LinkNode *pHead, int *pcnt)
{
    LinkNode *pFast = NULL;
    LinkNode *pSlow = NULL;
    LinkNode *pTmpNode = NULL;
    LinkNode *pNode1 = NULL;
    LinkNode *pNode2 = NULL;
    int ret = 0;
    int cnt = 1;

    pSlow = pFast = pHead->pNext;
    while (1)
    {
        pFast = pFast->pNext;
        if (NULL == pFast)
        {
            ret = 0;
            break;
        }
        pFast = pFast->pNext;
        if (NULL == pFast)
        {
            ret = 0;
            break;
        }

        pSlow = pSlow->pNext;
        if (pSlow == pFast)
        {
            ret = 1;
            break;
        }
    }

    if (1 == ret)
    {
        //获得环长
        pTmpNode = pSlow->pNext;
        while (pTmpNode != pSlow)
        {
            cnt++;
            pTmpNode = pTmpNode->pNext;
        }
        *pcnt = cnt;

        //获得环入口位置
        pNode1 = pSlow;
        pNode2 = pHead->pNext;
        while (1)
        {
            pNode1 = pNode1->pNext;
            pNode2 = pNode2->pNext;
            if (pNode1 == pNode2)
            {
                return pNode1;
            }
        }
    }

    return NULL;
}

二、总结

        单链表的基本操作必须熟链,以便对栈队列的理解。环,这个问题的处理思路也要熟悉,感觉很有趣。 

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

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

相关文章

开源的工作流系统突出优点总结

当前&#xff0c;想要实现高效率的办公&#xff0c;可以一起来了解低代码技术平台、开源的工作流系统的相关特点和功能优势。作为较受职场喜爱的平台产品&#xff0c;低代码技术平台拥有可视化才做界面、灵活、好维护操作等多个优势特点&#xff0c;在推动企业流程化办公的过程…

在线生成书法字帖,想练习什么字就练习什么字

有没有想练习一个字的时候发现找不到字帖的情况&#xff0c;现在推荐一款在线生成字帖的网站 可选择对应格子类型&#xff0c;生成你想练习的字 在线生成字帖

【简历】25届北京某211JAVA简历:外卖项目要点像玩一样

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份北京某211大学的java简历。上来第一要点还是要先确定求职层次&#xff0c;那211同学就不要想了&#xff0c;就一个目标&#xf…

mysql 死锁 锁表的解决方法

查看那个表锁了 SHOW OPEN TABLES where In_use > 0; show processlist SELECT * FROM information_schema.INNODB_TRX; 查看锁的进程 kill 掉进程id (trx_mysql_thread_id)

CAD中命令和系统变量

屏幕去除菜单全屏显示&#xff1a; ThisDrawing.SendCommand ("CLEANSCREENON ") 恢复原始&#xff1a;ThisDrawing.SendCommand ("CLEANSCREENOFF ") CAD中系统变量决定图形的基本设置。 第一个系统变量&#xff1a;uscicon vba代码如下&#xff1a; …

Flink CDC读取Mysql时,Decimal类型数据异常,变成了字符串(源码解析及解决方案)

1. 问题说明 使用Flink CDC 读取mysql数据时,当表字段为decimal时,读取的数据变成了字符串。 如下示例: 环境: Flink 1.18.0 Flink CDC 3.1.1 mysql 8 mysql的数据如下: 使用Flink CDC读取后的数据如下: 为了方便看,复制出来就是: {“id”:1,“price”:“AZA=”,…

时尚新潮流来袭!Kolors 一键试衣,畅享轻松购物

时尚新潮流来袭&#xff01;Kolors 一键试衣&#xff0c;畅享轻松购物 解决他们的烦恼话不多说&#xff0c;三键拿下Kolors 优点小结 时尚新潮流&#xff1a;虚拟试衣&#xff0c;开启便捷购物之旅&#x1f380; &#x1f31f; 你还在为网购试衣服不合适而烦恼吗&#xff1f;现…

OSI和TCP/IP参考模型、协议与端口、DNS解析类型、数据封装

目录 1.OSI和TCP/IP参考模型 1.1 为什么要进行网络分层&#xff1f; 1.2 TCP/IP和OSI参考模型 1.3 TCP/IP参考模型对应协议 2.对应协议和端口 3.基于IP的封装 4.DNS解析类型 5.数据封装与解封过程分析 5.1 封装 1.OSI和TCP/IP参考模型 1.1 为什么要进行网络分层&am…

人工智能如何将人机交互提升到新水平

随着人工智能模型在语音识别和合成、文本处理和多模态性方面的卓越表现&#xff0c;终极语音用户界面可能很快就会无处不在。欢迎来到雲闪世界。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 那是一个典型的星期五下午&#xff0c;我们刚刚结束了一个…

JNPF V5.0震撼升级,工作流开发全面重塑!

随着企业数字化转型的不断深入&#xff0c;低代码开发平台因其高效、便捷的特性&#xff0c;逐渐成为企业信息化建设的宠儿。作为低代码领域的佼佼者&#xff0c;JNPF低代码开发平台在V5.0版本中&#xff0c;对工作流开发进行了全面的重塑&#xff0c;旨在为企业提供更加灵活、…

【UE 编译】UE C++工程的编译流程、与C++编译的区别

目录 0 引言1 前置知识1.1 模块1.1.1 模块的定义与结构1.1.2. 模块类型1.1.3. 模块的描述文件&#xff1a;Build.cs1.1.4. 模块的编译与链接1.1.5. 模块的动态加载与卸载1.1.6. 模块的依赖与插件1.1.7. 模块的优点 1.2 插件1.2.1 UE插件的结构1.2.2 插件的类型 1.3 ProjectName…

FL Studio 24.1.1.4285官方中文版全新发布,最新功能解析

【功能强大&#xff1a;一站式音乐制作平台】 说到功能&#xff0c;这款软件简直就是全能战士。从录音、编曲到混音、母带处理&#xff0c;FL Studio几乎能涵盖音乐制作的方方面面。而且它还支持多种插件格式&#xff0c;让你的音乐作品更加丰富多彩。 【兼容性强&#xff1a;…

怎么对PDF文档大小进行压缩?2种压缩PDF的方法分享给你

PDF文档是一种非常常用的文件格式&#xff0c;我们平时看到的电子书、合同、报告、画册等内容大部分都是PDF格式的&#xff0c;由于PDF文档通常会带有大量的图片或文本&#xff0c;因此PDF文档可能会非常大&#xff0c;这样就会导致占用很多存储空间以及传输起来会非常麻烦&…

Spring中Bean的生命周期管理

Spring框架中的Bean生命周期是指从创建到销毁的整个过程。在这个过程中&#xff0c;Spring容器会负责管理Bean的状态和行为。以下是Spring中Bean生命周期的详细解释&#xff1a; 实例化&#xff1a;Spring容器根据Bean的定义信息&#xff0c;通过反射机制创建Bean对象。 设置属…

bat文件入门

1简介 BAT&#xff08;批处理&#xff09;脚本是一种在 Windows 系统中执行的脚本语言&#xff0c;用于自动化不同类型的任务。它可以执行多个命令和操作&#xff0c;并具有变量、参数、流程控制和文件处理等功能。BAT 脚本可以通过命令行或双击执行&#xff0c;并可以在脚本中…

vscode中如何设置不显示隐藏文件

在vscode中&#xff0c;有时候&#xff0c;会显示一些隐藏文件&#xff0c;如何设置让其不显示呢&#xff1f; 解决办法 例如&#xff1a;我这里有一个.vscode隐藏文件夹&#xff0c;是vscode默认生成的一个配置目录&#xff0c;我想要它不在资源管理器中进行显示。 操作步骤&a…

51单片机-LED闪烁

时间&#xff1a;2024.8.28 作者&#xff1a;Whappy 目的&#xff1a;学习51单片机 代码&#xff1a; #include <REGX52.H> #include "intrins.h"void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} …

vue实现二维码批量生成和打印

摘要&#xff1a;实现一个可以根据数据批量生成二维码标签页个批量打印标签页的组件。难点在于&#xff0c;文字和二维码如何合成一张图片进行打印&#xff0c;因为生成的二维码是图片&#xff0c;但文字和二维码整个内容其实是一个div。 效果展示 标签批量生成效果&#xff…

Google Earth Engine(GEE)——光谱指数影像的加载(真彩色和假彩色)以及NDVI的计算

简介 本实验的目的是了解一系列光谱指数,并培养计算您需要的任何指数的技能。在开始之前,我们将在上周实验室的基础上学习如何为任何感兴趣的地理位置查找图像。 编码面板的正上方是搜索栏。在此 GEE 搜索栏中搜索“达尔文”,然后单击结果以将地图平移和缩放至达尔文(图 …

Ubuntu中PCL、Eigen、ROS、Ceres、VScode相关操作,安装,卸载,文件存储位置基础合集

Ubuntu中PCL相关操作 查看PCL对应的版本号 apt-cache show libpcl-dev卸载PCL相关命令 sudo apt-get remove libpcl-dev如果想要完全卸载相关软件包及其配置文件&#xff0c;需要加上--purge参数&#xff1a; sudo apt-get --purge remove libpcl-dev Ubuntu中eigen相关操…