剑指offer.链表中环的入口节点

题目:
如果一个链表中包含环,如何找出环的入口节点?

思路:

1.我们首先需要的就是确定一个链表中包含环,如何确定一个链表中有没有环呢,其实我么就可以用快慢指针法,一个快指针,一个慢指针,从同一个节点出发,如果最后两个节点重合了,那么就说明里面存在环。

2.确定有环后就可以想如何找到链表中环的入口,我们还是可以用双指针进行寻找,让两个指针同时指向链表头结点,先确定链表中环的接点数n,我们让一个指针p2向后移动n,然后再让两个指针p1和p2同样的速度遍历,当两个指针重合,重合的节点位置就是环的入口。

3.现在唯一的问题就是如何确定环的节点数n,我们之前说判断环的方法就是判断两个快慢指针是否会重合,重合的位置一定是环内的任何一个点,重合以后我们只需要在这个点用一个指针进行遍历,遍历一次记一次数,最后回到原点就可以记录环内有多少个节点。

代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *entryNodeOfLoop(struct ListNode *head) {
    if(!head || !head->next) return NULL;
    struct ListNode *first = head,*second = head;
 
    while(first && second){
        first = first->next;
        second = second->next;
        if(second) second = second->next;
        else return NULL;
 
        if(first == second){
            first = head;
            while(first != second){
                first = first->next;
                second = second->next;
            }
            return first;
        }
    }
    return NULL;
}


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值