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

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

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

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

相关文章

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-