单链表求环的起始位置(快慢指针)

本文介绍了一种使用快慢指针的方法来查找链表中是否存在环,并定位环的起始节点。通过具体代码实现展示了如何在链表中查找环的具体过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include"ListNode.h"


class Solution2{

    public:
        ListNode* findCycle(ListNode* list){
        
            ListNode* fast = list;
            ListNode* slow = list;
            ListNode* meet = NULL;
//查找到快慢指针相遇位置并记录
            while(fast){
                
                fast = fast->next;
                slow = slow->next;
                
                if(!fast){
                    return NULL;
                }

                fast = fast->next;

                if(fast == slow){
                    meet = fast;
                    break;
                }         
            }
//判断相遇位置在末尾
           if(meet ==  NULL){
 
               return NULL;
           }

//一个指针从头节点开始,一个指针从相遇节点开始遍历,
//直到相遇,就是环开始的位置
             while(meet && list){

                 if(list == meet){
                     //返回相遇位置
                     return list;
                 }

                 list = list->next;
                 meet = meet->next;
             }

             return NULL;
            
        }
};
    



int main()
{
  ListNode a(8);
  ListNode b(1);
  ListNode c(2);
  ListNode d(3);
  ListNode e(4);
  a.next=&b;
  b.next=&c;
  c.next=&d;
  d.next=&c;
  std::cout<<"the List has been generated!"<<std::endl;
  ListNode* p = &a;
  Solution2 solution;
  ListNode*   result =solution.findCycle(p);
   std::cout<<"result: "<<result->val<<std::endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值