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

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

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

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

相关文章

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定