单向链表如何快速找到中间位置,判断是否有环,如何求环长

本文主要是介绍单向链表如何快速找到中间位置,判断是否有环,如何求环长,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于 数据结构->链式表->单向链表 的增删改查是比较简单的,今天我们来说一下其他的内容;

1.如何快速找到单向链表的中间节点;

        使用快慢指针,快指针每次走两步,慢指针每次走一步,由数学关系可知,快指针走到最后一个节点,慢指针走到中间节点(节点有奇数个)(偶数个时<4个><慢指针走到第二个节点>)

2.如何查找倒数第K个节点:

        使用快慢指针,让快指针比慢指针多走K个节点,然后两节点一起向后走,注意判断NULL的情况

3.如何进行单向链表的倒置;

        将第一个节点与头节点断开,再将节点依次用头插法插入,代码如下:

int turnLinklist(Linknode *pHead)
{Linknode *ptemp1 = NULL:Linknode *ptemp2 = NULL:ptemp1 = pHead->pnext;pHead->pnext = NULL;ptemp2 = ptemp1;while(pTemp != NULL){ptemp1 = ptemp1->pnext;ptemp2->pnext = NULL;pHead->pnext = ptemp2;ptemp2 = ptemp1;}return 0;
}

4.如何对单向链表进行冒泡排序;

        用两个指针,指向链表,一个指在第一个节点,一个指在第二个节点,两个指针同时向后走,比较大小且交换,再用第三个指针记录每次后一个指针的最终位置,下一次前一个指针走到这里就停止掉。代码如下:

int Bubbleslist(Listnode *pHead)
{Linknode *before = NULL;Linknode *after = NULL;Linknode *post = NULL;char *ptemp = NULL;if(pHead->pnext == NULL || pHead->pnext->pnext == NULL){return 0;}while(1){before = pHead->pnext->pnext;after = pHead->pnext;while(before != post){if(after->data > before->data)   //从小到大排序{ptemp = before->data;before->data = after->data;after->data = ptemp;   }before = before->pnext;after = after->pnext;}post = after;}return 0;
}

5.如何对单向链表进行选择排序;

        用两个指针(post,swp)同时指在第一个节点,用一个指针(ptemp)向后走,如果找到一个数大于swp指的节点数据,就让swp指向这个新数据的节点,如此下去,直至走完,再比较post和swp是否相同,不相同就进行交换,下一次遍历让post指针指在第二个节点,从而完成排序。代码如下:

int selectLinklist(LinkNode *pHead)
{LinkNode *temp = NULL;LinkNode *first = NULL;LinkNode *temp1 = NULL;DataType tempnum = 0;if(pHead->pNext == NULL){return 0;}first = pHead->pNext;while(first->pNext != NULL){temp = first;temp1 = first->pNext;while(temp1 != NULL){if(temp1->Data < temp->Data){temp = temp1;}temp1 = temp1->pNext;}if(temp != first){tempnum = first->Data;first->Data = temp->Data;temp->Data = tempnum;}first = first->pNext;}return 0;
}

选择排序和冒泡排序相比,选择排序的交换次数更少,时间上能优化一点;

6.不知道头结点,如何删除该节点;

        将下一个节点的数据放在当前节点,然后删除下一个节点,并将本节点和下下个节点连接起来;

7.如何判断单向链表是否有环;

        使用快慢指针,快指针走两步,慢指针走一步,当快慢指针相遇时则表明有环;

8.若单向链表有环,如何求环长;

        从相遇的节点往后走,并计数,再一次走到相遇的节点,计数次数就是环长;

9.若单向链表有环,如何求环入口;

        定义两个指针,一个从开头的位置往后走,一个从相遇的位置往后走,当这两指针相遇时,则该节点为环入口的节点;

这篇关于单向链表如何快速找到中间位置,判断是否有环,如何求环长的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120468

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c