判断链表中是否有环
描述
判断给定的链表中是否有环,如果有环则返回True,否则返回False
数据范围:链表长度\(0\le n\le 1000\), 链表中任意节点的值满足\(\mid val\mid \le 100000\)
输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。
解法思路:利用快慢指针,快指针前进2步,慢指针前进1步,如果有环,总能相遇,如果没环,则快指针会先行到达链表的尾部变为None
代码:
class Solution:
def hasCycle(self , head: ListNode) -> bool:
p1 = p2 = head # p1为慢指针,p2位快指针
while p2 and p2.next:
p1 = p1.next # 慢指针走一步
p2 = p2.next.next # 快指针走两步
if p1 == p2: # 如果相遇,则说明有环
return True
return False