函数:

  1. ListNode* MeetingNode(ListNode* pHead)
  2. {
  3. if(pHead==nullptr)
  4. return nullptr;
  5. ListNode* quickNode=pHead;
  6. ListNode* slowNode=pHead;
  7.  
  8. while(quickNode->m_pNext!=nullptr&&quickNode->m_pNext->m_pNext!=nullptr)
  9. {
  10. quickNode=quickNode->m_pNext->m_pNext;
  11. slowNode=slowNode->m_pNext;
  12. if(quickNode==slowNode)
  13. break;
  14. }
  15. if(quickNode!=slowNode)
  16. {
  17. return nullptr;
  18. }
  19. return slowNode;
  20. }
  21.  
  22. ListNode* EntryNodeOfLoop(ListNode* pHead)
  23. {
  24. ListNode* meetingNode=MeetingNode(pHead);
  25. if(meetingNode==nullptr)
  26. return nullptr;
  27. int nodesInLoop=;
  28. ListNode* pTemp=meetingNode;
  29. while(pTemp->m_pNext!=meetingNode)
  30. {
  31. pTemp=pTemp->m_pNext;
  32. nodesInLoop++;
  33. }
  34. ListNode* quickNode=pHead;
  35. ListNode* slowNode=pHead;
  36. for(int i=;i<nodesInLoop;i++)
  37. quickNode=quickNode->m_pNext;
  38. while(slowNode!=quickNode)
  39. {
  40. quickNode=quickNode->m_pNext;
  41. slowNode=slowNode->m_pNext;
  42. }
  43. return slowNode;
  44. }

测试代码:

  1. #include"List.h"
  2.  
  3. void Test(char* testName,ListNode* pHead,ListNode* expect)
  4. {
  5. cout<<testName<<":";
  6. ListNode* result=EntryNodeOfLoop(pHead);
  7. if(result==nullptr)
  8. {
  9. cout<<"No loop in the link list."<<endl;
  10. }
  11. else if(result==expect)
  12. {
  13. cout<<"Passed."<<endl;
  14. }
  15. else
  16. cout<<"Failed."<<endl;
  17. }
  18.  
  19. void Test1_7()
  20. {
  21. ListNode* pNode1=CreateListNode();
  22. ConnectListNodes(pNode1,pNode1);
  23. Test("test1",pNode1,pNode1);
  24. ListNode* pNode2=CreateListNode();
  25. ListNode* pNode3=CreateListNode();
  26. ListNode* pNode4=CreateListNode();
  27. ListNode* pNode5=CreateListNode();
  28. ListNode* pNode6=CreateListNode();
  29.  
  30. ConnectListNodes(pNode1,pNode2);
  31. ConnectListNodes(pNode2,pNode3);
  32. ConnectListNodes(pNode3,pNode4);
  33. ConnectListNodes(pNode4,pNode5);
  34. ConnectListNodes(pNode5,pNode6);
  35. ConnectListNodes(pNode6,pNode3);
  36. Test("test2",pNode1,pNode3);
  37. ConnectListNodes(pNode6,pNode6);
  38. Test("test3",pNode1,pNode6);
  39. Test("test4",nullptr,nullptr);
  40. ConnectListNodes(pNode6,nullptr);
  41. Test("test5",pNode1,nullptr);
  42. DestroyList(pNode1);//注意销毁所定义的指针和链表
  43. }
  44.  
  45. int main()
  46. {
  47. Test1_7();
  48. return ;
  49. }

主要要销毁所定义的指针变量和链表。如果链表中存在环,则可以一个个节点去释放。

剑指offer——面试题23:链表中环的入口节点的更多相关文章

  1. 剑指offer(55)链表中环的入口节点

    题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析 1.一快一慢指针,先找到碰撞点. 2.然后碰撞点到入口节点的距离就是头结点到入口节点的距离. 具体原理可 ...

  2. 【剑指offer】面试题 23. 链表中环的入口节点

    面试题 23. 链表中环的入口节点

  3. 【剑指Offer】55、链表中环的入口结点

      题目描述:   给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null.   解题思路:   本题是一个比较典型的链表题目,难度适中.首先,对于大多人来说,看到这道题是比较开心的 ...

  4. 剑指offer 面试题 删除链表中重复的节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  5. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  6. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  7. 剑指Offer:面试题23——从上往下打印二叉树(java实现)

    问题描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 按照层次遍历的方法,使用队列辅助. 1.将根结点加入队列. 2.循环出队,打印当前元素,若该结点有左子树,则将其加入队列,若 ...

  8. 【剑指offer 面试题23】从上往下打印二叉树

    思路: 没啥好说的,BFS. C++: #include <iostream> #include <queue> using namespace std; struct Tre ...

  9. 剑指offer面试题23:从上到下打印二叉树(树的层序遍历)

    题目:从上往下打印出二叉树的每个节点,同一层的结点按照从左往右的顺序打印. 解题思路:二叉树的层序遍历,在打印一个节点的时候,要把他的子节点保存起来打印第一层要把第二层的节点保存起来, 打印第二层要把 ...

随机推荐

  1. networkX用法整

    无向图,有向图,加权图等例子代码 [http://www.cnblogs.com/kaituorensheng/p/5423131.html#_label1] 数据分析学习笔记(三)-NetworkX ...

  2. Mosquitto 单向SSL配置

    Mosquitto 单向SSL配置 摘自:https://blog.csdn.net/a_bcd_123/article/details/70167833 2017年04月14日 06:56:06 s ...

  3. 3.3.6-1 ArrayBlockingQueue简单分析

    构造方法:public ArrayBlockingQueue(int capacity) { this(capacity, false); } public ArrayBlockingQueue(in ...

  4. [GO]简单的并发服务器

    package main import ( "net" "fmt" "strings" ) func HandleConn(conn net ...

  5. 团体程序设计天梯赛L2-003 月饼 2017-03-22 18:17 42人阅读 评论(0) 收藏

    L2-003. 月饼 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不 ...

  6. Java 理论与实践: 修复 Java 内存模型,第 2 部分(转载)

    在 JSR 133 中 JMM 会有什么改变? 活跃了将近三年的 JSR 133,近期发布了关于如何修复 Java 内存模型(Java Memory Model, JMM)的公开建议.在本系列文章的 ...

  7. java学习(一)数据类型

    一.java的安装及环境变量的配置 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...

  8. XE5应用开发支持的安卓设备

    XE5应用开发支持的安卓设备 A.官方文档声明 RADStudio 支持Android设备的应用开发,android版本从2.3到4.3.x,ARMv7处理器,MEON支持.根据Embarcadero ...

  9. java-04流程控制语句

    这里先简单介绍几种流程控制语句 包括if/if-else.switch语句 1.三大流程控制结构 所谓流程控制,就是说要控制程序的执行方式,根据不同的情况执行不同的代码,从而得到不同情况下的不同结果. ...

  10. .Net程序随系统开机启动(仿Foxmail托盘效果控制)

    对于使.NET程序随系统开机启动,最常用的可能就是向在注册表中注册开机启动项,或是建立Windows服务,使程序随系统启动而启动.这里以WinForm程序为例,测试Demo分享,同时附上对于程序托盘的 ...