python判断单向链表是否包括环,若包含则计算环入口的节点实例分析

yipeiwu_com7年前Python基础

本文实例讲述了python判断单向链表是否包括环,若包含则计算环入口的节点。分享给大家供大家参考,具体如下:

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

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

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

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

# -*- coding:utf-8 -*-
'''
Created on 2019年10月23日
@author: Administrator
'''
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)

运行结果:

存在环结构
2

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

相关文章

简单谈谈Python的pycurl模块

pycurl是一个用c语言编写的libcurl Python实现,功能非常强大,支持操作协议有FTP,HTTP,HTTPS,TELNET等。 模块的常用方法说明: close()方法...

python模拟登陆Tom邮箱示例分享

复制代码 代码如下:def loginTom(username, password): url1 = ''' http://login.mail.tom.com/cg...

在Python的列表中利用remove()方法删除元素的教程

 remove()方法从列表中删除第一个obj。 语法 以下是remove()方法的语法: list.remove(obj) 参数   &n...

探寻python多线程ctrl+c退出问题解决方案

场景: 经常会遇到下述问题:很多io busy的应用采取多线程的方式来解决,但这时候会发现python命令行不响应ctrl-c 了,而对应的java代码则没有问题: 复制代码 代码如下:...

进一步探究Python的装饰器的运用

装饰器在 python 中用的相当广泛,如果你用过 python 的一些 web 框架,那么一定对其中的 “ route() 装饰器” 不陌生,今天咱们再看一个具体的案例。 咱们来模拟一...