面试中的算法 [ 持续更新中 ] 基于Python语言 如何判断链表有环

server/2024/9/23 5:19:27/

本文主要介绍了如何判断链表有环的问题,并进行了延伸: 如果链表有环如何求出环的长度,入环节点... ...嗯,点个赞总可以不!!!

目录

5.1如何判断链表有环

5.1.1 有一个单向链表链表中可能出现“环”,那么如何判断该列表是否为有环链表呢?

5.1.2 如果链表有环,如何求出环的长度

5.1.3 如果链表有环,如何求出入环节点


5.1如何判断链表有环

5.1.1 有一个单向链表链表中可能出现“环”,那么如何判断该列表是否为有环链表呢?
首先创建两个指针p1、p2(在Python中就是两个对象引用),让它们同时指向这个链表的头结点。然后开始一个大循环,在循环体中,让指针p1每次向后移动1个节点,让指针p2每次向后移动2个节点,然后比较两个指针指向的节点是否相同。如果相同,则可以判断出链表有环,如果不同,则继续进行下一次循环。

节点数量为n,则时间复杂度为O(n),空间复杂度为O(1)。

python"># 判断链表是否有环问题
class Node:def __init__(self,data):self.data = dataself.next = None
​
def is_cycle(head):p1 = headp2 = headwhile p2 is not None and p2.next is not None:p1 = p1.nextp2 = p2.next.nextif p1 == p2:return Truereturn False
​
node1 = Node(5)
node2 = Node(3)
node3 = Node(7)
node4 = Node(2)
node5 = Node(6)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node2
print(is_cycle(node1))
5.1.2 如果链表有环,如何求出环的长度

两个指针首次相遇,证明链表有环,让两个指针从相遇点继续前进,并统计循环的次数,直到两个指针第二次相遇。此时,统计出来的前进的次数就是环长。

P1走一步,P2走两步,所以再次相遇的时候,P2走的路程是P1的两倍,多走了整整一圈。

因此,环长 = 每一次速度差 x 前进次数 = 前进次数

5.1.3 如果链表有环,如何求出入环节点

当两个指针首次相遇时,各自走的路程是多少呢?

指针P1一次走一步,所走的距离是D+S1

指针P2一次走两步,多走了n(n>=1)圈,所走的距离是D+S1+n(S1+S2)

因为P2的速度是P1的两倍,所以走的路程也应该是P1的两倍:

2(D+S1) = D+S1+n(S1+S2) ——> D = (n-1)(S1+S2)+S2

方法就是,把其中一个指针放回到头结点位置,另一个指针保持在首次相遇点,两个指针都每次向前走一步。那么,他们最终相遇的节点,就是入环节点。


http://www.ppmy.cn/server/96288.html

相关文章

serial 反序列化靶机

1.安装靶机 2.扫描靶机ip,端口,访问 3.扫描目录,发现有 backup 目录,访问发现是压缩包,下载,解压,查看 通过审计源代码了解到: 首次访问该网站后,会通过 user.class.php 中的创建一个user对象, 内容为wel变量创建welcome对象,同时进行序列化base64编码存入cookie,在此过程中调用…

自学黑客(网络安全)

前言: 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“…

Visual Studio创建 OpenCV项目

1、cmake 编译 opencv 参考链接:CMake编译OpenCV3.4.1心得_cmake 3.4.1-CSDN博客 1)opencv文件名最好不要有空格 2)没有下载opencv_contrib,不用配置OPENCV_EXTRA_MODULES_PATH 1、Visual Studio创建 OpenCV项目 参考链接&am…

线程 【Linux】

文章目录 线程页表POSIX线程库pthread_create线程等待pthread_join 线程终止pthread_cancelpthread_self 分离线程 线程ID&&进程地址空间布局 线程 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程…

Linux----Docker详解

葡萄美酒夜光杯,欲饮琵琶马上催。 醉卧沙场君莫笑,古来征战几人回? 目录 一,docker简介 二,docker架构 三,docker安装 四,docker常见操作 五,容器操作 六,数据卷 一&…

数据结构第九讲:二叉树

数据结构第九讲:二叉树 1.实现链式结构二叉树1.1二叉树的节点结构1.2创建二叉树节点1.3前中后序遍历1.3.1前序遍历1.3.2中序遍历1.3.3后序遍历1.3.4总结 1.4二叉树结点的个数1.4.1错误示范1.4.2实现方法 1.5二叉树叶子结点的个数1.6二叉树第k层结点的个数1.7二叉树的…

网络安全 - 应急响应检查表

前言 本项目旨在为应急响应提供全方位辅助,以便快速解决问题。结合自身经验和网络资料,形成检查清单,期待大家提供更多技巧,共同完善本项目。愿大家在应急之路一帆风顺。 图片皆来源于网络,如有侵权请联系删除。 一…

前端面试题- 如何让vue页面重新渲染

哈喽小伙伴们,大家好!我是爱学英语的程序员,上周五结束了我的第一段实习,接下来将会为大家继续更新面试题系列,不断积累,不断进步! 在Vue中,可以使用以下几种方式让页面重新渲染: 改变数据状态: Vue中的响应式系统会自动监听数据的变化&am…