Python链表中环的入口结点

本文阅读 1 分钟
首页 Python笔记 正文

寻找链表中环的入口结点主要分成三个步骤:首先是设置两个快慢指针,如果快慢指针相遇,则快慢指针必然都在环中;然后从相遇的地方设置一个指针向后遍历并记录走的步数,当这个指针重新指到开始的位置的时候,当前对应的步数就是环中结点的数量k;然后设置两个指针从链表开始,第一个节点先走k步,然后第二个指针指到链表的开始,两个指针每次都向后走一步,两个指针相遇的位置就是链表的入口。

  1. '''
  2. 一个链表中包含环,请找出该链表的环的入口结点。
  3. '''
  4. # -*- coding:utf-8 -*-
  5. class ListNode:
  6. def __init__(self, x):
  7. self.val = x
  8. self.next = None
  9. class Solution:
  10. def MeetingNode(self, pHead):
  11. if pHead == None:
  12. return None
  13. pSlow = pHead.next
  14. if pSlow == None:
  15. return None
  16. pFast = pSlow.next
  17. while pFast:
  18. if pSlow == pFast:
  19. return pSlow
  20. pSlow = pSlow.next
  21. pFast = pFast.next
  22. if pFast:
  23. pFast = pFast.next
  24. def EntryNodeOfLoop(self, pHead):
  25. meetingNode = self.MeetingNode(pHead)
  26. if not meetingNode:
  27. return None
  28. NodeLoop = 1
  29. flagNode = meetingNode
  30. while flagNode.next != meetingNode:
  31. NodeLoop += 1
  32. flagNode = flagNode.next
  33. pFast = pHead
  34. for i in range(NodeLoop):
  35. pFast = pFast.next
  36. pSlow = pHead
  37. while pFast != pSlow:
  38. pFast = pFast.next
  39. pSlow = pSlow.next
  40. return pFast
  41. node1 = ListNode(1)
  42. node2 = ListNode(2)
  43. node3 = ListNode(3)
  44. node4 = ListNode(4)
  45. node5 = ListNode(5)
  46. node6 = ListNode(6)
  47. node1.next = node2
  48. node2.next = node3
  49. node3.next = node4
  50. node4.next = node5
  51. node5.next = node6
  52. node6.next = node3
  53. s = Solution()
  54. print(s.EntryNodeOfLoop(node1).val)
解压密码: detechn或detechn.com

免责声明

本站所有资源出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。

本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户自行鉴别,做一个有主见和判断力的用户。

本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。

Python字符流中第一个不重复的字符
« 上一篇 01-21
Python删除链表中重复的结点
下一篇 » 01-21

发表评论