判断单向列表是否包括环,若包含,环入口的节点计算 python实现

本文介绍了一种使用快慢指针来判断链表中是否存在环结构的方法,并详细展示了如何找到环的起始节点。通过一个具体的例子演示了算法的具体实现过程。

 

关于数据结构相关的面试题,经常会问到链表中是否存在环结构的判断,下图就是存在环结构的链表。

那么如何判断链表中是否存在环呢,下面解法的思路是采用快慢指针:

两个指向头节点的指针,fastslow,一起从头结点开始往后遍历,fast每次移动两个节点,slow每次移动一个节点,

这样,如果存在环结构,那么fast指针在不断绕环过程中,肯定会追上slow指针。

 class Node(): #定义一个Node类,构造两个属性,一个是item节点值,一个是节点的下一个指向
      def __init__(self,item=None):
          self.item = item
          self.next = None

 def findbeginofloop(head):#判断是否为环结构并且查找环结构的入口节点
     slowPtr = head         #将头节点赋予slowPtr
     fastPtr = head         #将头节点赋予fastPtr
     loopExist =False       #默认环不存在,为False
     if head == None:       #如果头节点就是空的,那肯定就不存在环结构
         return False
     while fastPtr.next != None and fastPtr.next.next != None:      #fastPtr的下一个节点和下下个节点都不为空
         slowPtr = slowPtr.next           #slowPtr每次移动一个节点
         fastPtr = fastPtr.next.next      #fastPtr每次移动两个节点 
         if slowPtr == fastPtr :          #当fastPtr和slowPtr的节点相同时,也就是两个指针相遇了
             loopExist = True
             print("存在环结构")
             break

     if loopExist == True:
         slowPtr  = head
         while slowPtr != fastPtr:
             fastPtr = fastPtr.next
             slowPtr = slowPtr.next
         return slowPtr

     print("不是环结构")
     return False

 if __name__ == "__main__":
     node1 = Node(1)
     node2 = Node(2)
     node3 = Node(3)
     node4 = Node(4)
     node5 = Node(5)
     node1.next = node2
     node2.next = node3
     node3.next = node4
     node4.next = node5
     node5.next = node2
     print(findbeginofloop(node1).item)

 

转载于:https://www.cnblogs.com/kunpengv5/p/7784791.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值