剑指offer——面试题23:链表中环的入口节点
函数:
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:链表中环的入口节点的更多相关文章
- 剑指offer(55)链表中环的入口节点
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析 1.一快一慢指针,先找到碰撞点. 2.然后碰撞点到入口节点的距离就是头结点到入口节点的距离. 具体原理可 ...
- 【剑指offer】面试题 23. 链表中环的入口节点
面试题 23. 链表中环的入口节点
- 【剑指Offer】55、链表中环的入口结点
题目描述: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 解题思路: 本题是一个比较典型的链表题目,难度适中.首先,对于大多人来说,看到这道题是比较开心的 ...
- 剑指offer 面试题 删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指Offer:面试题23——从上往下打印二叉树(java实现)
问题描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 按照层次遍历的方法,使用队列辅助. 1.将根结点加入队列. 2.循环出队,打印当前元素,若该结点有左子树,则将其加入队列,若 ...
- 【剑指offer 面试题23】从上往下打印二叉树
思路: 没啥好说的,BFS. C++: #include <iostream> #include <queue> using namespace std; struct Tre ...
- 剑指offer面试题23:从上到下打印二叉树(树的层序遍历)
题目:从上往下打印出二叉树的每个节点,同一层的结点按照从左往右的顺序打印. 解题思路:二叉树的层序遍历,在打印一个节点的时候,要把他的子节点保存起来打印第一层要把第二层的节点保存起来, 打印第二层要把 ...
随机推荐
- jquery设置select选中的文本
<select id="prov"> <option value="1">北京市</option> <option ...
- 设计模式(java)--模版方法模式之任务分配
转自:http://blog.csdn.net/zhengzhb/article/details/7405608 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构 ...
- Linux下oracle定时备份
1. 设置数据库空表可导出(oracel11g) 用PL/SQL登录数据库(或者其他工具) 执行: select 'alter table '||table_name||' allocate exte ...
- 重叠IO
一. 异步IO 说到重叠模型首先还是提一下异步IO比较好,因为从本质上讲,重叠模型也是一种异步IO模型. 我们知道,相对于计算机执行的其他操作而言,设备IO(文件.管道.套接 ...
- Linux文件排序工具 sort 命令详解
sort是排序工具,它完美贯彻了Unix哲学:"只做一件事,并做到完美".它的排序功能极强.极完整,只要文件中的数据足够规则,它几乎可以排出所有想要的排序结果,是一个非常优质的工具 ...
- 51nod1298圆与三角形——(二分法)
1298 圆与三角形 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出圆的圆心和半径,以及三角形的三个顶点,问圆同 ...
- VC6.0 多线程输出乱序问题
今天尝试编写多线程最简单的例子 #include "stdafx.h" #include "windows.h" #include <iostream&g ...
- 用 Inkscape 做 SVG 给 TPath
FireMonkey 里的 TPathData 支持 SVG 的基本绘图指令,因此可以运用 Inkscape 软件,提取 SVG 的绘图内容,请见图片说明: INKSCAPE https://inks ...
- [leetcode] 1. Valid Palindrome
leetcode的第一题,回文数判断. 原题如下: For example, "A man, a plan, a canal: Panama" is a palindrome. & ...
- google chrome 调试技巧:监控 DOM 元素被修改
在很多时候, 页面上一个元素的属于被修改.删除,子节点的添加与修改,很难一下找到对应的代码,在 google chrome 开发者工具里, 提供了对 DOM 元素的监控: 在 Elements 标签, ...