以下方法 摘自牛客网 两位大佬: @ 王清楚 & @ 牛客网
解法一 :快慢指针,大体思路摘抄自 牛客网 王清楚
快慢指针有环相遇证明
代码
class Solution:
def hasCycle(self, head):
slow = head
fast = head
circleFalg = 0
while fast is not None:
# 无环时,fast一定早于slow到达终点,除非只有一个节点
# 但这也不妨碍只判断 fast
if fast.next is not None:
slow = slow.next
fast = fast.next.next
else:
# 如果只含有一个节点
# 或者 fast已经达到终点 break
break
if fast == slow:
circleFalg = 1
break
if circleFalg == 1:
return True
else:
return False
解法二 :“变异”删除,大体思路摘抄自 牛客网 数据结构和算法
当无环时:
当有环时:
如上图所示,如果删到最后,肯定会出现head=head.next
public boolean hasCycle(ListNode head) {
//如果head为空,或者他的next指向为空,直接返回false
if (head == null || head.next == null)
return false;
//如果出现head.next = head表示有环
if (head.next == head)
return true;
ListNode nextNode = head.next;
//当前节点的next指向他自己,相当于把它删除了
head.next = head;
//然后递归,查看下一个节点
return hasCycle(nextNode);
}