C++实现LeetCode(141.单链表中的环)

yizhihongxing

下面我就为您详细讲解“C++实现LeetCode(141.单链表中的环)”的完整攻略。

问题描述

给定一个链表,判断链表中是否有环。

若链表中有环,则返回true,否则返回false。

示例输入与输出:

示例1:

输入: head = [3,2,0,-4], pos = 1

输出: true

解释: 链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入: head = [1,2], pos = 0

输出: true

解释: 链表中有一个环,其尾部连接到第一个节点。

思路解析

我们可以利用快慢指针的方法解决这个问题。

假设我们有两个指针,名为fast和slow。我们可以让slow每一次走一步,让fast每一次走两步。因为如果链表中存在环的话,fast一定会比slow先到达环中,然后二者在环中相遇。如果fast在走的过程中到达了链表的尾部,就表明链表中不存在环,此时我们可以返回false。

在代码中,我们可以利用两个指针来实现上述思路,具体步骤如下:

1.首先定义两个指针slow和fast,初始值都为链表的头节点head。

2.进入循环,循环结束的条件是fast或者fast的下一个节点为空。这个判断条件就是fast指针每次走动的时候都要判断是否为空。

3.每一次循环,slow走一步,fast走两步。如果fast为空或者fast的下一个节点为空,就直接返回false。

4.否则,如果fast和slow相遇了,就说明链表中存在环,返回true。

最后的代码如下所示:

bool hasCycle(ListNode *head) {
    if(head == NULL || head->next == NULL){
        return false;
    }
    ListNode* slow = head;
    ListNode* fast = head;
    while(fast != NULL && fast->next != NULL){
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast){
            return true;
        }
    }
    return false;
}

示例说明

下面我们将通过两个示例来说明刚才所讲的算法是如何工作的。

示例1:

输入: head = [3,2,0,-4], pos = 1

输出: true

解释: 链表中有一个环,其尾部连接到第二个节点。

我们可以根据输入来构造一个链表,如下所示:

3 -> 2 -> 0 -> -4

↑          ↓
- - - - - -

通过使用刚才所讲的算法,slow和fast的值会在节点2处相遇,因此算法返回true。

示例2:

输入: head = [1,2], pos = 0

输出: true

解释: 链表中有一个环,其尾部连接到第一个节点。

我们可以根据输入来构造一个链表,如下所示:

1 -> 2

↑ ↓


通过使用刚才所讲的算法,slow和fast的值会在节点1处相遇,因此算法返回true。

总结

使用快慢指针是解决链表环问题的一种简单有效的解法。我们可以将其中的思路应用到其他类似的问题中。在实际的应用中,我们不仅要掌握这个算法的原理,还要注意边界条件的判断和代码优化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(141.单链表中的环) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • iOS xcconfig编写示例教程

    下面是关于“iOS xcconfig编写示例教程”的完整攻略,包含以下内容: 什么是xcconfig文件 xcconfig文件是一种配置文件,它被用于在编译iOS应用程序时传递参数。通过xcconfig文件,我们可以方便地管理应用程序的编译选项、预处理宏定义、库搜索路径等信息。当我们需要对开发环境进行更改时,只需要修改xcconfig文件就可以了,而无需修改…

    other 2023年6月27日
    00
  • JS+Canvas实现自定义头像功能

    JS+Canvas实现自定义头像功能需要以下步骤: 步骤一:创建画布元素 首先,需要在页面中创建一个canvas标签作为画布元素。可以通过以下HTML代码进行创建: <canvas id="canvas" width="200" height="200"></canvas> …

    other 2023年6月25日
    00
  • torrent是什么文件?怎么打开?

    Torrent是什么文件?怎么打开? Torrent是一种用于下载和共享文件的协议和文件类型。它允许用户通过将文件分成小块并从多个来源下载这些块来实现高速下载。Torrent文件本身是一个包含元数据的小文件,其中包含了指向实际文件的链接、文件大小、文件名和其他相关信息。 要打开Torrent文件并开始下载文件,您需要遵循以下步骤: 选择Torrent客户端软…

    other 2023年8月5日
    00
  • i5 9400F和i5 8400哪个值得买 Intel酷睿i5-9400F和8400区别对比

    i5 9400F和i5 8400的区别对比 1. 性能比较 i5 9400F 核心/线程数:6核心/6线程 基础频率:2.9 GHz 最大睿频:4.1 GHz 缓存:9 MB TDP:65W i5 8400 核心/线程数:6核心/6线程 基础频率:2.8 GHz 最大睿频:4.0 GHz 缓存:9 MB TDP:65W 从性能上来看,i5 9400F和i5 …

    other 2023年8月6日
    00
  • vue 2.0 开发实践总结之疑难篇

    Vue 2.0 开发实践总结之疑难篇的完整攻略 Vue 2.0 是一款流行的前端框架,但在实践中,我们可能会遇到一些疑难问题。本文将为您提供一份详细的 Vue 2.0 开发实践总结之疑难篇的完整攻略,包括两个示例说明。 示例1:如何在 Vue 中使用第三方库? 在 Vue 中使用第三方库可能会遇到一些问题,例如无法正确引入库、无法正确使用库等。可以按照以下步…

    other 2023年5月5日
    00
  • Go语言学习函数+结构体+方法+接口

    Go语言学习函数+结构体+方法+接口 函数 函数是Go语言中的一等公民,可以像普通变量一样被传递、赋值和使用。函数的定义方式如下: func 函数名(参数列表) (返回值列表) { //函数体 } 其中,参数列表和返回值列表可以为空。 示例代码: package main import "fmt" func add(a, b int) i…

    other 2023年6月27日
    00
  • 荣耀7快速充电测试数据及图表 充电最快的华为手机!

    手机型号 充电时间(分钟) 华为P40 Pro 30 华为Mate 40 35 以上是华为手机充电时间的测试数据。根据测试结果,华为P40 Pro是充电最快的华为手机,充电时间为30分钟。华为Mate 40的充电时间稍长,为35分钟。 请注意,充电时间可能会受到多种因素的影响,如电池容量、充电器功率等。以上数据仅供参考,实际充电时间可能会有所差异。

    other 2023年10月16日
    00
  • node的包管理工具:yarn和npm

    下面是关于“node的包管理工具:yarn和npm”的完整攻略,包含两个示例说明。 简介 在Node.js开发中,包管理工具是必不可少的。npm和yarn是两个常用的包管理工具,本文介绍它们的用法和区别。 npm npm是Node.js的默认包管理工具,它可以用来安装、升级、卸载管理Node.js模块。以下是一些常用的npm命令: 安装模块:npm inst…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部