链表是否带环/求环的长度/求环的入口点

#include<iostream>
#include<assert.h>
using namespace std;

struct Node
{
   int data;
   Node* next;
   Node(const int x)
       :data(x)
       ,next(NULL)
   {}
};


----------**********************************************************


//1.判断两个链表是否带环,如果带环返回指针相遇点(快慢指针法)----时间复杂度O(N)
Node* CheckCycle(Node* PHead)
{
    if (PHead==NULL||PHead->next==NULL)//链表为空或者只有一个结点且next为空,返回NULL
    {
        return NULL;
    }
    Node* slow=PHead;
    Node* fast=PHead;
    while (fast&&fast->next)
    {
        fast=fast->next->next;//快指针每次走两步
        slow=slow->next;//慢指针每次走一步
        //相交,返回相遇结点
        if (fast==slow)
        {
            return fast;
        }
    }
    //不相交
    return NULL;
}


----------**********************************************************


//2.若链表带环,求带环的长度---O(N)
int GetCycleLength(Node* meet)//meet为快慢指针在环内的相遇结点
{
    Node* start=meet->next;
    int num=1;
    while (start!=meet)
    {
        start=start->next;
        num++;
    }
    return num;
}


----------**********************************************************


//3.若带环求环的入口点----O(N)
Node* GetCycleEntryNode(Node* PHead,Node* meet)
{
    assert(PHead&&meet);
    Node* Start=PHead;
    Node* Meet=meet;
    while (Start!=Meet)
    {
        Start=Start->next;
        Meet=Meet->next;
    }
    return Meet;
}


----------***********************************************


void test()
{
    Node* node1=new Node(1);
    Node* node2=new Node(2);
    Node* node3=new Node(3);
    Node* node4=new Node(4);
    Node* node5=new Node(5);
    Node* node6=new Node(6);
    Node* node7=new Node(7);
    Node* node8=new Node(8);
    Node* node9=new Node(9);
    Node* node10=new Node(10);
    node1->next=node2;
    node2->next=node3;
    node3->next=node4;
    node4->next=node5;
    node5->next=node6;
    node6->next=node7;
    node7->next=node8;
    node8->next=node9;
    node9->next=node10;
    node10->next=node5;
    Node* meet=CheckCycle(node1);
    cout<<"快慢指针相遇点值"<<meet->data<<endl;
    int length=GetCycleLength(meet);
    cout<<"带环链表的长度"<<length<<endl;
    Node* entry=GetCycleEntryNode(node1,meet);
    cout<<"带环链表的入口点的结点的值"<<entry->data<<endl;
}
int main()
{
    test();
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值