环形链表Python3

  题解:

# 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
        while fast != None and fast.next != None:
            fast = fast.next.next
            slow = slow.next
            if fast == slow:
                return True
        return False

解题思路:这一题可能出现两种情况,即链表有环和无环,可以采用双指针法。

①链表有环,如图,定义快慢指针slow和fast刚开始指向head,随后fast指针每次都比slow多走一步(slow走一步,fast走两步),链表有环就相当于是一个环形操场,fast已经跑上环形操场3位置了,slow还没上操场跑道(还在2的位置),不过没关系,只要有这个环形操场,slow迟早会上跑道在后面追上fast。跑步轨迹如下:

slow:1    ->    2    ->      ->    4    ->    5    ->    6    ->    7    

fast: 1    ->    3    ->    5    ->    7    ->      ->      ->    7  

  ②链表没有环,也就是上图8指向空指针,那么slow就永远也追不上fast。

所以,为了防止fast跑两步之后越界了,要先规定好fast指针指向的下一个节点和下下个节点都不是空指针时才进行循环,否则就跳出循环,直接返回链表没有环即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值