链表中环的入口结点
2016-04-25 18:26
211 查看
链表中环的入口结点
一个链表中包含环,请找出该链表的环的入口结点。对于找相遇点的问题,“快慢”指针是一个很好的突破口,在这个问题描述中如果我们知道环中结点的个数n:便很好的可以利用”快慢“的性质,如定义P1,P2两个指针,P2先移动n个结点,然后P1,P2一起移动,则相遇的结点就是我们所求的入口结点。(P2移动的结点数-P1移动的结点数=n)
环中个数的求解:
同理采用“快慢”指针的思想,定义指针P1,P2,假设P2的移动速度是P1的两倍,因为链表中存在环,所以P1和P2肯定在环中相遇,记录该结点,动态维护一个移动值i,P1继续移动到该结点时,移动值i为该环的个数
具体AC代码如下:
public ListNode EntryNodeOfLoop(ListNode pHead) { ListNode p1=pHead; ListNode p2=pHead; int n=getNodeOfLoop(pHead); if(n==-1) return null; for(int i=0;i<n;i++) { p1=p1.next; } while(p1!=p2) { p1=p1.next; p2=p2.next; } return p1; } private int getNodeOfLoop(ListNode pHead)//-1表示不存在环; { if(pHead==null) return -1; ListNode p1=pHead.next; if(p1==null) return -1; ListNode p2=pHead.next.next; while(p1!=null&&p2!=null&&p1!=p2) { p1=p1.next; p2=p2.next.next; } //当P1=P2时跳出循环依次移动获取环中结点个数 ListNode p3=p2.next;; int numOfLoop=1; while(p3!=p1) { p3=p3.next; numOfLoop++; } return numOfLoop; }
总结:
其实通过此题可以衍生很多类似的问题,例如如何判断两个链表是否相交,以及如何求出相交的结点等等问题都可以采用”快慢指针”的思想。希望可以通过此题的分析可以帮助读者。相关文章推荐
- [C/C++]反转链表
- 关于指针的一些事情
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C# Pointer指针应用实例简述
- C++智能指针实例详解
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- C++编程指向成员的指针以及this指针的基本使用指南
- 详解C++中的指针、数组指针与函数指针
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++中字符串以及数组和指针的互相使用讲解
- C语言安全之数组长度与指针实例解析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- C#通过指针实现快速拷贝的方法
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统