#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;
}
链表是否带环/求环的长度/求环的入口点
最新推荐文章于 2021-05-21 16:14:30 发布