python怎么实现环形链表
发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,本篇内容介绍了"python怎么实现环形链表"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!【题目】给
千家信息网最后更新 2024年11月20日python怎么实现环形链表
本篇内容介绍了"python怎么实现环形链表"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
【题目】
给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 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 解释:链表中没有环。
提示:
· 链表中节点的数目范围是 [0, 104] · -105 <= Node.val <= 105 · pos 为 -1 或者链表中的一个 有效索引 。
【思路】
设置快慢指针,快指针每次前进两步,慢指针每次前进一步,那么只要链表有环,两指针肯定会相遇。
【代码】
python版本
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: ListNode) -> bool:
# 快指针前进两步,满指针前进一步
# 如果有环,肯定会相遇
fast, slow = head, head
while fast:
# 指针前移
if fast and fast.next:
fast = fast.next.next
slow = slow.next
else:
return False
# 相遇
if fast == slow:
return True
return False
【相似题目】
142. 环形链表 II
解题思路:
慢指针前进步数:step = a + b + n * c (a为进环前的元素数;b为剩余的步数,c为环的元素数)
快指针前进步数:2 * step = a + b + m * c (m > n,m - n为快指针相对于慢指针多走了多少圈)
环的起点位置,对应前进步数为a,那么:a = (m - 2n) * c - b
进一步得到:a = (m - 2n + 1) * c + (c - b)
那么,慢指针回到head,两指针都每次只移动一步,那么在此相遇点就是环的起点
代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
# 找到相遇点
fast, slow = head, head
flag = False # 没有环
while fast:
if fast and fast.next:
fast = fast.next.next
slow = slow.next
else:
break
if fast == slow:
flag = True
break
if not flag:
return None
# step = a + b + n * c (a为进环前的元素数;b为剩余的步数,c为环的元素数)
# 2 * step = a + b + m * c (m > n,m - n为快指针相对于慢指针多走了多少圈)
# ==> a = (m - 2n) * c - b
# a = (m - 2n + 1) * c + (c - b)
# 慢指针回到head,两指针都每次只移动一步,那么在此相遇点就是环的起点
slow = head
while fast != slow:
fast = fast.next
slow = slow.next
return fast
"python怎么实现环形链表"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
指针
步数
元素
节点
输出
环形
示例
起点
进一
解释
输入
代码
位置
内容
实际
就是
尾部
思路
情况
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
徐州市网络安全公司有哪些
数据库具有的数据安全性
红桥区辅助网络技术售后服务
手机打出去显示无法联接服务器
数据库中1对1的实体
戴尔r900服务器
银河证券软件开发怎么样
绩效考评软件开发
深圳有名软件开发
linux搭建饥荒服务器
mc服务器加载地图时一直加载
网络安全等保测评程序
网络安全的攻防报告
光学模组软件开发
服务器的流量
软件开发年薪有50万吗
组装服务器不稳定怎么办
加强网络安全人才
数据库表的基础操作实验小结
数据库上面怎么查主机
dede数据库后门查杀
域名网址与服务器网站的关系
SQL数据库文件权限修改
海湾战争视频软件开发
数据库mdb文件路径
dede数据库替换
云服务器管理蓝兔网络
利用数据库对数据进行管理
福建精英网络技术咨询口碑推荐
我的世界神话服务器下载