快慢指针)
- 首先特殊情况:空链表与长度为1的链表必没有环
- 快慢指针:快指针每次走两步,慢指针每次走一步
- 如果有环形表,快慢指针终究会相遇,但是未必在终点相遇
class Solution(object):
def hasCycle(self, head):
l=head
if l == None or l.next==None:
return False
r=l.next
while r!= None:
if r==l:
return True
else:
if r.next != None:
r=r.next.next
l=l.next
else:
return False
return False
注意: 这里再加设了r.next!=None,防止到尾结点还循环。
解答中的直接做法开始直接设置r.next != None是:
class Solution(object):
def hasCycle(self, head):
l=head
if l == None or l.next==None:
return False
r=l.next
while r.next!= None:
if r==l:
return True
else:
r=r.next.next
l=l.next
return False
哈希表
使用指针cur对链表节点进行遍历,如果有出现过的节点,则认为存在环形链表。
class Solution(object):
def hasCycle(self, head):
seen=set()
cur=head
while cur:
if cur in seen:
return True
else:
seen.add(cur)
cur=cur.next
return False