文章目录

  • 用python 判断一个单链表是否有环.
  • 第二次做DAY20201130
    • [141. 环形链表](https://leetcode-cn.com/problems/linked-list-cycle/)
      • 方法1 路径记录法
      • 方法2 快慢指针法
        • 第1种解法
        • 另一种写法

用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.comhttps://leetcode.com/problems/linked-list-cycle/141. Linked List Cycle
Easy123193FavoriteShare
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 = valueself.next = Noneclass Solution1:"""思路分析:判断一个单链表是否有环,可以用 set 存放每一个 节点, 这样每次 访问后把节点丢到这个集合里面.其实 可以遍历这个单链表, 访问过后,如果这个节点 不在 set  里面, 把这个节点放入到 set 集合里面.如果这个节点在  set 里面 , 说明曾经访问过, 所以这个链表有重新 走到了这个节点, 因此一定有环.如果链表都走完了, 把所有的节点都放完了. 还是没有重复的节点, 那说明没有环."""def hasCycle(self, head):mapping = set()flag = Falsep = headwhile p:if p not in mapping:mapping.add(p)else:flag = Truebreakp = p.nextreturn flag

还有一个解决方案:

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

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



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

图形分析

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

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

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

看下图:

class Solution:"""定义 两个指针, 一个快指针fast, 一个慢指针slow,  快指针一次都两步,慢指针一次走一步. 如果 两个指针相遇了, 则说明链表是有环的. 如果 fast 都走到null了, 还没有相遇则说明没有环. """def hasCycle(self, head):flag = Falseif head is None or head.next is None or head.next.next is None:return flagfast = head.next.nextslow = head.nextwhile fast is not slow:if fast.next is None or fast.next.next is None:# no circlereturn flagfast = fast.next.nextslow = slow.next# 相遇肯定有环if fast is slow:# hasCircleflag = Truereturn flag

第二次做DAY20201130

闲下来 之前的代码 写的不够优雅,今天 重新修改了一下 之前的代码,这样写看起来 比 之前的代码 稍微 好看一点,详细请看下面

141. 环形链表

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos-1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回 true 。 否则,返回 false

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

方法1 路径记录法

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def hasCycle(self, head: ListNode) -> bool:visited = set() while head:cur = headif cur not in visited:visited.add(cur)else:return Truehead = head.next return False class Solution02:def hasCycle(self, head: ListNode) -> bool:seen = set()while head:if head in seen:return Trueseen.add(head)head = head.nextreturn False

方法2 快慢指针法

第1种解法
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def hasCycle(self, head: ListNode) -> bool:if not head:return False slow = head fast = head.next while fast and fast.next:if fast ==slow:return True fast= fast.next.next slow = slow.next return False
另一种写法
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def hasCycle(self, head: ListNode) -> bool:if head is None or  head.next is None:return False slow = head fast  =head.next while slow != fast:    if fast is None or fast.next is None:return False fast = fast.next.next slow = slow.next return True

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

用python 判断一个单链表是否有环相关推荐

  1. 判断一个单链表是否有环,若有,找出环的入口节点

    题目:如何判断一个单链表是否有环?若有环,如何找出环的入口节点. 一.单链表是否有环 思路分析: 单链表有环,是指单链表中某个节点的next指针域指向的是链表中在它之前的某一个节点,这样在链表的尾部形 ...

  2. 如何判断一个单链表是否有环?

    快慢指针查询,快指针每次跳两个,慢指针每次跳一个,如果两指针相等时,就证明有环 环的入口: 用两个指针,一个指向快慢指针相交点(这里就是慢指针走,慢指针在走快指针的一半就相当于快指针走的路了,还会到这 ...

  3. 单链表——判断一个单链表中是否有环

    2019独角兽企业重金招聘Python工程师标准>>> package jxau.lyx.link;/*** * @author: liyixiang* @data:2014-10- ...

  4. 判断一个单链表中是否存在环

    #判断一个单链表中是否存在 环. #设置两个指针(fast, slow),初始值都指向头,slow每次前进1步,fast每次前进2步, 大概的思路如下: 如果链表存在环,则fast必定先进入环,而sl ...

  5. 【数据结构】判断一个单链表中各结点的值是否有序

    count记录的是单链表的总长 count1记录的是升序的结点的个数 count2记录的是降序的结点的个数 如果count1或者count2等于count,那么就说明该序列是升序或者降序的. 稍加改进 ...

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

    思路:快慢指针实现 用两个指针,一个指针一次走一步,另一个指针一次走两步,如果存在环,则这两个指针会在环内相遇,时间复杂度为O(n) /*** 检测单链表中是否有环*/public static bo ...

  7. 判断单链表是否存在环

    周末参加完美世界校园招聘中就有一道判断单链表是否有环的编程题. 写一个C/C++函数,来判断一个单链表是否具有环,如果存在环,则给出环的入口点. 有一个单链表,其中可能有一个环,也就是某个节点的nex ...

  8. Python如何创建一个单链表,以及实现单链表的增,删,改,查操作,以及对单链表的排序功能

    标题Python如何创建一个单链表,以及实现单链表的增,删,改,查操作,以及对单链表的排序功能 #功能: 实现单链表的构建和功能操作 #定义单链表的类 class Node:""& ...

  9. c++如何判断两个字符串是否相同?_链表 | 如何判断两个单链表(无环)是否交叉...

    如何判断两个单链表(无环)是否交叉 单链表相交指的是两个链表存在完全重合的部分,如下图所示 在上图中,这两个链表相交于结点5,要求判断两个链表是否相交,如果相交,找出相交处的结点. 分析 Hash法 ...

最新文章

  1. Git安装配置(Linux)
  2. Tomcat配置虚拟路径,使上传文件与服务器及工程文件分离开
  3. Java 洛谷 P5461 赦免战俘讲解
  4. 【收藏】Linux系统常用命令速查手册(附PDF下载链接)
  5. [导入]毕业的大学生的100条忠告
  6. visio对象放入word显示不全_办公人士必学visio技能 手把手教你使用visio绘制项目全景图!...
  7. 判断鼠标是否在元素上_是否清扫保洁、是否雾撒降尘?江城环卫车装上了北斗,动动鼠标就知道了...
  8. ORA-28001: the password has expired (DBD ERROR: OCISessionBegin)解决办法
  9. pytorch: 自定义数据集加载
  10. 安装win10和ubuntu16双系统
  11. JAVA练习216-整数的英语表示
  12. 2012 九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)
  13. video全局事件属性
  14. python词云代码手机_【云计算】爬取淘宝手机品牌词云分析(python)
  15. 添加或修改Kindle图书封面
  16. DC靶机系列------6
  17. 简述组装计算机硬件流程,计算机硬件组装的步骤有哪些?
  18. windows10下Weblogic官网下载与安装教程
  19. 计算机网络—网关介绍
  20. VS2008+VP5开发环境配置

热门文章

  1. acc 蓝牙_蓝牙耳机≠音质差,只是你没选对耳机
  2. 每日一犬 · 哈瓦那犬
  3. 谷歌浏览器调试时页面的刷新与强制刷新+清空缓存的操作
  4. 【源码】SIMULINK中的Logitech X-56 H.O.T.A.S飞行控制器
  5. C语言设计流水灯程序,花式流水灯c语言程序.pdf
  6. 2022南理工824专考研经验
  7. 苹果邮箱怎么登录qq邮箱_qq邮箱app下载安装-手机QQ邮箱2020下载v6.1.0 官方安卓版...
  8. STM32cubeIDE使用CCMRAM
  9. STM32cubeHAL ADC+TIM+DMA (二)
  10. 百家云CEO李钢江给员工们的一封信(转载)