面试23题:

题目:如果一个链表中包含环,如何找出环的入口节点?

解题分析:其实此题可以分解为三个题目:1)如何判断一个链表中是否包含环?2)如何找到环的入口节点?3)如何得到环中节点的数目?

解决此题:可以设置两个指针,一快一慢。

1.两个指针一个fast、一个slow同时从一个链表的头部出发
  fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇,(如果相遇就证明此链表包含环,否则没有环,解决问题1)
2.1 此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内),
    这次两个指针一次走一步,相遇的地方就是入口节点(解决问题2,得到环的入口节点)。
2. 2  接着步骤1,如果两个指针相遇,必然在环内,所以可以从这个节点出发,一遍继续向前移动,一遍计数,当再次回到这个节点时,就可以得到环中节点数了(解决问题3,得到环中节点数目)
 
解题代码:
# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
pFast=pHead
pSlow=pHead
while pFast!=None and pFast.next!=None:
pFast=pFast.next.next
pSlow=pSlow.next
#两个指针相遇且非空,则说明有环
if pFast==pSlow:
break
if pFast==None or pFast.next==None:
return None
pFast=pHead
while (pFast != pSlow):
pFast = pFast.next
pSlow = pSlow.next
#返回环的入口节点
return pFast

如果另需求环中节点的个数,可以更改代码为:

# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
pFast=pHead
pSlow=pHead
while pFast!=None and pFast.next!=None:
pFast=pFast.next.next
pSlow=pSlow.next
#两个指针相遇且非空,则说明有环
if pFast==pSlow:
break
if pFast==None or pFast.next==None:
return None
meetingNode=pFast
nodesInLoop=1
while(pFast.next!=meetingNode):
pFast=pFast.next
nodesInLoop+=1
#返回环中节点数目
return nodesInLoop

最新文章

  1. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
  2. TextView属性android:ellipsize="marquee"不生效的解决办法
  3. C#调用Win32API
  4. iOS 状态栏隐藏显示
  5. git学习1:git安装和配置
  6. 传统B2B中小型企业如何做好全网营销
  7. MYSQL线程池总结(一)
  8. Java自定义异常类
  9. [转]MySQL排序原理与案例分析
  10. 移植UE4的模型操作到Unity中
  11. hibernate学习笔记--可选的配置属性
  12. UVALive 6602 Counting Lattice Squares
  13. ios专题 - 安全
  14. 忘记了SqlServer的SA密码怎么办
  15. UVA - 11020 Efficient Solutions(Multiset)
  16. SQL Server 执行计划重编译的两大情况
  17. 【NOIP2012】【CJOJ1093】【洛谷1083】借教室
  18. UILTView经典知识点练习
  19. python2x如何迁移代码到python3中
  20. nohup 部署springboot 使用命令

热门文章

  1. atitit.taskService 任务管理器的设计 v1
  2. ZooKeeper_基础知识学习
  3. UVA 11885 - Number of Battlefields(斐波那契)
  4. 【Nginx-反向代理server】基础知识(二)之多进程模式
  5. Visual Studio - 引入动态库
  6. jquery的param()
  7. Python内置函数之bool()
  8. 谁说selenium打开firefox不用驱动的???!!!!
  9. 华为HiAI 助力苏宁易购,让你尽享完美视觉购物体验!
  10. [开源]C#中开源软件大汇总(外国的)