iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >用python 判断一个单链表是否有环.
  • 780
分享到

用python 判断一个单链表是否有环.

链表python 2023-01-31 07:01:36 780人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

用python 判断一个单链表是否有环. https://LeetCode.com/problems/linked-list-cycle/ 思路1: 判断一个单链表是否有环, 可以用 set 存放每一个 节点, 这样每次 访问后

python 判断一个单链表是否有环.

https://LeetCode.com/problems/linked-list-cycle/

思路1:

判断一个单链表是否有环,
可以用 set 存放每一个 节点, 这样每次 访问后把节点丢到这个集合里面.
其实 可以遍历这个单链表, 访问过后,
如果这个节点 不在 set 里面, 把这个节点放入到 set 集合里面.
如果这个节点在 set 里面 , 说明曾经访问过, 所以这个链表有重新 走到了这个节点, 因此一定有环
如果链表都走完了, 把所有的节点都放完了. 还是没有重复的节点, 那说明没有环.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@Time    : 2019/1/12 00:59
@File    : has_circle.py
@Author  : frank.chang@shoufuyou.com

Https://leetcode.com/problems/linked-list-cycle/


141. Linked List Cycle
Easy

1231

93

Favorite

Share
Given a linked list, determine if it has a cycle in it.

To represent a cycle in the given linked list,
we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to.
If pos is -1, then there is no cycle in the linked list.



Example 1:

Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where tail connects to the second node.


Example 2:

Input: head = [1,2], pos = 0
Output: true
Explanation: There is a cycle in the linked list, where tail connects to the first node.


Example 3:

Input: head = [1], pos = -1
Output: false
Explanation: There is no cycle in the linked list.




Follow up:

Can you solve it using O(1) (i.e. constant) memory?

Accepted
340,579
Submissions
971,443

"""
class LinkNode:

    def __init__(self, value):
        self.value = value
        self.next = None


class Solution1:
    """
    思路分析:
    判断一个单链表是否有环,
    可以用 set 存放每一个 节点, 这样每次 访问后把节点丢到这个集合里面.
    其实 可以遍历这个单链表, 访问过后,
    如果这个节点 不在 set  里面, 把这个节点放入到 set 集合里面.
    如果这个节点在  set 里面 , 说明曾经访问过, 所以这个链表有重新 走到了这个节点, 因此一定有环.

    如果链表都走完了, 把所有的节点都放完了. 还是没有重复的节点, 那说明没有环.

    """

    def hasCycle(self, head):

        mapping = set()

        flag = False

        p = head

        while p:

            if p not in mapping:
                mapping.add(p)
            else:
                flag = True
                break
            p = p.next

        return flag




还有一个解决方案:

定义 两个指针, 一个快指针fast, 一个慢指针slow, 快指针一次走两步,慢指针一次走一步.
如果 两个指针相遇了, 则说明链表是有环的.
如果 fast 都走到null了, 还没有相遇则说明没有环.

为什么是这样呢? 简单分析一下?
图1

图片2

图片3

图片4
图片5

图片6

图片7
用图形来分析一下,这样可以清晰一点.

图形分析

因为快指针 先走 所以快指针先进入环,之后慢指针后进入环, 无论如何,

最后 要么 慢指针进入环的时候, 快指针可能已经走了 很多遍环, 也有可能没有走完环. 但无论如何 当慢指针 进入环的时候,
fast 有可能在 慢指针的后面, 或者前面, 无论如何 快指针 是必慢指针走的快的 , 所以 只要有环 一定可以 和慢指针来一次相遇.

你可能想 会不会错过呢?
答案 是不会的. 你想 快指针一次 走两步, 慢指针一次都一步.
假设 这是一条无穷尽的单链表. 他们 每走一步, 两者之间的距离就减1, 所以 只要链表足够长, 是一定会相遇的.

看下图:
图片8

class Solution:
    """
    定义 两个指针, 一个快指针fast, 一个慢指针slow,  快指针一次都两步,慢指针一次走一步. 
    如果 两个指针相遇了, 则说明链表是有环的. 
    如果 fast 都走到null了, 还没有相遇则说明没有环. 


    """

    def hasCycle(self, head):

        flag = False
        if head is None or head.next is None or head.next.next is None:
            return flag

        fast = head.next.next
        slow = head.next

        while fast is not slow:

            if fast.next is None or fast.next.next is None:
                # no circle
                return flag
            fast = fast.next.next
            slow = slow.next

        # 相遇肯定有环
        if fast is slow:
            # hasCircle
            flag = True

        return flag


if __name__ == '__main__':
    pass

分享感动,留住快乐. 2019-01-27 11:53:45 --frank

--结束END--

本文标题: 用python 判断一个单链表是否有环.

本文链接: https://www.lsjlt.com/news/191300.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 用python 判断一个单链表是否有环.
    用python 判断一个单链表是否有环. https://leetcode.com/problems/linked-list-cycle/ 思路1: 判断一个单链表是否有环, 可以用 set 存放每一个 节点, 这样每次 访问后...
    99+
    2023-01-31
    链表 python
  • HTML怎么判断一个非空单链表是否是递增有序的
    本篇内容介绍了“HTML怎么判断一个非空单链表是否是递增有序的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • Python判断是否json是否包含一个
    jsonObject 是个jsonif (key in jsonObject) :    print '有'else:    print '没有' ...
    99+
    2023-01-31
    判断是否 Python json
  • java怎么判断两个链表是否相交
    判断两个链表是否相交的方法可以使用双指针的方式。具体步骤如下: 定义两个指针p1和p2,分别指向链表1和链表2的头节点。 同时遍历...
    99+
    2023-10-22
    java
  • Golang如何判断两个链表是否相交
    这篇文章主要介绍“Golang如何判断两个链表是否相交”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang如何判断两个链表是否相交”文章能帮助大家解决问题。算法题:判断2个链表相交方法一:ma...
    99+
    2023-07-05
  • sql怎么判断一个表是否存在
    在SQL中,可以使用以下的语句来判断一个表是否存在: IF EXISTS(SELECT 1 FROM information...
    99+
    2024-04-09
    sql
  • Python判断一个变量是否存在
    在调用一个变量的时候,如果这个变量没有被定义,那么python会报错。要解决的方法也很简单,就是事先给变量赋一个空值。但是也可以通过调用系统的内置函数来判断一个变量名是否已经被定义了。有3个内置函数都可以实现。res1 = 'test' i...
    99+
    2023-01-31
    变量 是否存在 Python
  • Python使用SQList判断表是否存
    需求是这样的:如果player表不存在,则创建表。 网上最多的是 SELECT count(*) FROM sqlite_master WHERE type='table' AND name='tableName'; 但是...
    99+
    2023-01-31
    Python SQList
  • Golang判断两个链表是否相交的方法详解
    目录算法题:判断2个链表相交方法一:map方法二:首尾相接法算法题:判断2个链表相交 面试中可能会问到的算法题,今天总结一下 方法一:map 步骤: 1.遍历list1,以节点为ke...
    99+
    2023-03-14
    Golang判断链表是否相交 Golang判断链表相交 Golang链表相交
  • 如何判断一个网站是否有cdn
    在Windows系统中检测网站是否有cdn的方法在Windows系统中使用组合键“win+R”,输入“cmd”,进入DOS窗口;进入DOS窗口后,在窗口中输入“nslookup + 网站域名”,进行查询;最后,在Address栏中查看IP地...
    99+
    2024-04-02
  • 怎么在mysql中判断一个表是否存在
    在mysql中判断表是否存在的方法:1.启动mysql;2.登录mysql数据库;3.选择并进入数据库;4.执行命令判断;具体步骤如下:首先,在本地环境中启动mysql服务;service mysql start mys...
    99+
    2024-04-02
  • 怎么在postgresql中判断一个表是否存在
    在postgresql中判断表是否存在的方法:1.启动postgresql服务;2.登录postgresql数据库;3.使用数据库;4.执行命令判断;具体步骤如下:首先,在命令行中启动postgresql服务;net start postg...
    99+
    2024-04-02
  • python 输入一个整数,判断其是否既
    v = int(input('请输入一个整数:')) if v % 3 == 0 and v % 5 ==0: print(v,'即是3的倍数又是5的倍数') else: print('不是3或5的倍数') ...
    99+
    2023-01-30
    整数 python
  • Python--判断一个字符串是否包含某
    (1).find()方法:            Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否...
    99+
    2023-01-31
    字符串 Python
  • Python中如何判断两个列表是否相等
    Python中如何判断两个列表是否相等,需要具体代码示例在编程中,经常会遇到需要判断两个列表是否相等的情况。Python提供了几种方法来实现这个判断,下面将详细介绍这些方法并给出具体的代码示例。方法一:使用“==”运算符Python中的列表...
    99+
    2023-10-22
    列表相等判断
  • jquery如何判断是否是一个数组
    这篇文章主要介绍了jquery如何判断是否是一个数组的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇jquery如何判断是否是一个数组文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • 判断一个数是否是素数(Java版)
    目录 素数的定义 求解素数 素数判定法1: 遍历从2到n-1的所有数字,判断是否有可以被n整除的数,如果没有,则为素数。 优化法2: 判定的范围改为[2 -,n/2]。当 i>n/2 时,则判定为素数。 优化法3: 在Java中判定素数的范...
    99+
    2023-10-07
    java 开发语言 算法 idea
  • 在python中怎么 判断一个值是否为Nan
    在 Python 中,可以使用 math.isnan() 或者 numpy.isnan() 来判断一个值是否为 NaN。 示例代码如下: import mathimport numpy as np# ...
    99+
    2023-09-02
    python numpy 开发语言
  • python3 判断列表是一个空列表
    @(python3) 有个判断列表是否为空的需求,试了好多方式,比如: a = [] if a is not None: COMMAND a = [] if a[0] is None: COMMAND 各种乱七八...
    99+
    2023-01-31
    是一个 列表
  • python中如何判断路径是否为链接
    python中判断路径是否为链接的方法:1、在win操作系统中找到python程序目录;2、打开idle工具;3、在idle中新建一个shell脚本;4、输入“import os”指令导入os模块;5、通过“os.path.islink(路...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作