版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40244153/article/details/88081162
题目:一个链表中包含环,如何找出环的入口结点?例如,在图3.8的链表中,环的入口结点是结点3。
思路:
1.确定链表是否有环:通过两个不同速度的指针确定,当两个指针指向同一个结点时,该结点为环中的一个结点。
2.确定环中结点的数目n:指针走一圈,边走边计数
3.找到环的入口:从头结点开始,通过两个相差为n的指针来得到(即寻找链表中倒数第n+1个结点)
考点:代码的鲁棒性
实现:
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(isCircle(pHead) == null) return null;
int n=1;
ListNode end = isCircle(pHead);
ListNode begin = end.next;
while(end!=begin){
begin = begin.next;
n++;
}
ListNode slow = pHead;
ListNode fast = pHead;
while(n-->0){
fast=fast.next;
}
while(fast!=slow){
slow = slow.next;
fast = fast.next;
}
return fast;
}
public ListNode isCircle(ListNode head){
if(head == null ||head.next == null) return null;
ListNode slow= head.next;
ListNode fast= head.next.next;
while(slow!=fast){
if(fast.next.next!=null){
slow=slow.next;
fast=fast.next.next;
}else{
return null;
}
}
return slow;
}
收获:
- 通过两个不同速度的指针可以确定链表中是否有环
- 相差n步的两个指针可以找到倒数第n+1个结点(类似于链表中倒数第k个结点)
- 复杂问题分解成为几个简单问题(本题分为三步:找出环中任一结点;得到环的个数;找到入口结点)