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

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

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

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

相关文章

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

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

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命