141.环形链表
题目
给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪next
指针再次到达,则链表中存在环。为了表示给定链表中的环,我们使用整数pos
来表示链表尾连接到链表中的位置(索引从0开始)。如果pos
是-1
,则在该链表中没有环。注意pos
不作为参数进行传递。仅仅是为了比哦啊哈斯链表的实际情况。
如果链表中存在环,则返回true
。否则,返回false
示例:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
结果:
#class ListNode:
#def __init__(self,x):
#self.val=x
#self.next=None
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if not head or head.next==None:
return False
slow,faster=head,head.next
while slow and faster:
if slow==faster:
return True
slow = slow.next
if faster.next:
faster=faster.next.next
else:
return False
return False
思路就是,如果头指针为空,那么为空链表,然后慢指针为头指针,快链表为活动指针,如果两个指针都一样,说明成环,否则慢指针先移动一下格子,也就是指向快指针指向的位置,快指针判断下一指针位是否有东西,如果有,就指向他。如上面图所示,
- 先判断3号和2号是否为空,结果不为空
- slow移动到2号,faster移动到0号
- 直到faster移动到4号,发现slow==faster,因为因为faster在0的时候,faster.next就是指向4号,然后faster.next.next就是指向2号。
测试用例
这里用例我也花了2个小时才勉强把底层搭建出来,太菜了,而且还没有完成复现题目的那种,情况,只能通过了一种首尾链表的情况,还望各位大佬指导
class Player:
def __init__(self):
self.name=""
self.score=0
self.next=None
def ShowLink(head,num=None,is_print=False):
if head.next is None:
return None
ptr=head
count=0
while True:
count+=1
if is_print:
print('No.'+str(count), ptr.name, ptr.score, '--->', ptr.next.name)
if count==num:
break
if ptr.next==head:
break
ptr=ptr.next
return ptr #返回遍历完成后最后一个节点
def establishCycle(head,num=None):
count=0
while True:
count+=1
if count==num:
ptr.next=head
break
def hasCycle(head):
if not head or head.next==None:
return False
slow,faster=head,head.next
while slow and faster:
if slow==faster:
return True
slow=slow.next
if faster.next:
faster=faster.next.next
else:
return False
return False
head=Player()
ptr=head
while True:
select=input("1 开始 2 查看 3 改变环的起始 4 检查是否成环 5 结束 ")
if select=="1":
ptr=ShowLink(head)
if ptr is None:
head.name=input("name:")
head.score=input("score:")
head.next=head
else:
next_data=Player()
next_data.name=input("name:")
next_data.score=input("score:")
next_data.next=head
ptr.next=next_data
elif select=='2':
ShowLink(head,is_print=True)
elif select=='3':
establishCycle(head,3)
elif select=='4':
print(hasCycle(head))
elif select=='5':
break