函数:

 ListNode* MeetingNode(ListNode* pHead)
{
if(pHead==nullptr)
return nullptr;
ListNode* quickNode=pHead;
ListNode* slowNode=pHead; while(quickNode->m_pNext!=nullptr&&quickNode->m_pNext->m_pNext!=nullptr)
{
quickNode=quickNode->m_pNext->m_pNext;
slowNode=slowNode->m_pNext;
if(quickNode==slowNode)
break;
}
if(quickNode!=slowNode)
{
return nullptr;
}
return slowNode;
} ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode* meetingNode=MeetingNode(pHead);
if(meetingNode==nullptr)
return nullptr;
int nodesInLoop=;
ListNode* pTemp=meetingNode;
while(pTemp->m_pNext!=meetingNode)
{
pTemp=pTemp->m_pNext;
nodesInLoop++;
}
ListNode* quickNode=pHead;
ListNode* slowNode=pHead;
for(int i=;i<nodesInLoop;i++)
quickNode=quickNode->m_pNext;
while(slowNode!=quickNode)
{
quickNode=quickNode->m_pNext;
slowNode=slowNode->m_pNext;
}
return slowNode;
}

测试代码:

 #include"List.h"

 void Test(char* testName,ListNode* pHead,ListNode* expect)
{
cout<<testName<<":";
ListNode* result=EntryNodeOfLoop(pHead);
if(result==nullptr)
{
cout<<"No loop in the link list."<<endl;
}
else if(result==expect)
{
cout<<"Passed."<<endl;
}
else
cout<<"Failed."<<endl;
} void Test1_7()
{
ListNode* pNode1=CreateListNode();
ConnectListNodes(pNode1,pNode1);
Test("test1",pNode1,pNode1);
ListNode* pNode2=CreateListNode();
ListNode* pNode3=CreateListNode();
ListNode* pNode4=CreateListNode();
ListNode* pNode5=CreateListNode();
ListNode* pNode6=CreateListNode(); ConnectListNodes(pNode1,pNode2);
ConnectListNodes(pNode2,pNode3);
ConnectListNodes(pNode3,pNode4);
ConnectListNodes(pNode4,pNode5);
ConnectListNodes(pNode5,pNode6);
ConnectListNodes(pNode6,pNode3);
Test("test2",pNode1,pNode3);
ConnectListNodes(pNode6,pNode6);
Test("test3",pNode1,pNode6);
Test("test4",nullptr,nullptr);
ConnectListNodes(pNode6,nullptr);
Test("test5",pNode1,nullptr);
DestroyList(pNode1);//注意销毁所定义的指针和链表
} int main()
{
Test1_7();
return ;
}

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

剑指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. jquery设置select选中的文本

    <select id="prov">  <option value="1">北京市</option>  <option ...

  2. 设计模式(java)--模版方法模式之任务分配

    转自:http://blog.csdn.net/zhengzhb/article/details/7405608 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构 ...

  3. Linux下oracle定时备份

    1. 设置数据库空表可导出(oracel11g) 用PL/SQL登录数据库(或者其他工具) 执行: select 'alter table '||table_name||' allocate exte ...

  4. 重叠IO

    一. 异步IO        说到重叠模型首先还是提一下异步IO比较好,因为从本质上讲,重叠模型也是一种异步IO模型.       我们知道,相对于计算机执行的其他操作而言,设备IO(文件.管道.套接 ...

  5. Linux文件排序工具 sort 命令详解

    sort是排序工具,它完美贯彻了Unix哲学:"只做一件事,并做到完美".它的排序功能极强.极完整,只要文件中的数据足够规则,它几乎可以排出所有想要的排序结果,是一个非常优质的工具 ...

  6. 51nod1298圆与三角形——(二分法)

    1298 圆与三角形  题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出圆的圆心和半径,以及三角形的三个顶点,问圆同 ...

  7. VC6.0 多线程输出乱序问题

    今天尝试编写多线程最简单的例子 #include "stdafx.h" #include "windows.h" #include <iostream&g ...

  8. 用 Inkscape 做 SVG 给 TPath

    FireMonkey 里的 TPathData 支持 SVG 的基本绘图指令,因此可以运用 Inkscape 软件,提取 SVG 的绘图内容,请见图片说明: INKSCAPE https://inks ...

  9. [leetcode] 1. Valid Palindrome

    leetcode的第一题,回文数判断. 原题如下: For example, "A man, a plan, a canal: Panama" is a palindrome. & ...

  10. google chrome 调试技巧:监控 DOM 元素被修改

    在很多时候, 页面上一个元素的属于被修改.删除,子节点的添加与修改,很难一下找到对应的代码,在 google chrome 开发者工具里, 提供了对 DOM 元素的监控: 在 Elements 标签, ...