给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
解法一:
借助辅助空间,set借助hash表记录便利过的节点代码实现:
def hasCycle(head):
# 借助hash表,记录每个便利过的节点
# m = {}
# while head:
# if m.get(head):
# return True
# m[head] = 1
# head = head.next
# return False
# 写法二,借助辅助空间
a = set()
while head:
if head in a:
return True
a.add(head)
head = head.next
return False
解法二:
快慢指针思想,如果链表存在环,快指针总能追上慢指针
代码实现:
def hasCycle(head):
# 利用快慢指针,若存在环,快指针总能追上慢指针
# 写法一:
# sp, fp, si = head, head, False
# while fp:
# if si:
# si = si.next
# si = False
# else:
# si = True
# fp = fp.next
# if fp == sp:
# return True
# return False
# 写法二:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow is fast:
return True
return False
解法三:
采用计数器的思想,假设 计数器阈值为10000(只要是大于链表中实际节点的一个合理的数字),大于10000我们视作为有环。
代码实现:
def hasCycle(head):
# 采用计数器,假设计数器阈值中10000个节点(只要是一个合理的
# 大于链表实际节点的数),超过10000个就算有环
count = 0
while head and count <= 10000:
count, head = count+1, head.next
return count > 10000
解法四:
可以在便利的过程标记val值,便利到有标记的节点,我们就可认定为有环
代码实现:
def hasCycle(head):
# 标记val值,只要有环,标记值就会重复
while head:
if head.val == '1':
return True
head.val = '1'
head = head.next
return False
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)