#include<iostream.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void main()
{
int n,m,count1=0,count2=0;
cout<<"单链表的长度:"<<endl;
cin>>n;
cout<<"循环链表的长度:"<<endl;
cin>>m;
LinkList head=(LinkList)malloc(sizeof(LNode));
LinkList p,q,s,t,curr,head2;
head->data=1;
head->next=NULL;
p=head;
curr=p->next;
for(int i=2;i<=n+1;i++)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=i;
s->next=curr;
p->next=s;
p=s;
curr=p->next;
}
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void main()
{
int n,m,count1=0,count2=0;
cout<<"单链表的长度:"<<endl;
cin>>n;
cout<<"循环链表的长度:"<<endl;
cin>>m;
LinkList head=(LinkList)malloc(sizeof(LNode));
LinkList p,q,s,t,curr,head2;
head->data=1;
head->next=NULL;
p=head;
curr=p->next;
for(int i=2;i<=n+1;i++)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=i;
s->next=curr;
p->next=s;
p=s;
curr=p->next;
}
head2=s;
p=head2;
for( i=n+2;i<=m;i++)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=i;
s->next=p->next;
p->next=s;
p=s;
}
p->next=head2;
//cout<<p->next->data<<endl;
p=head2;
s=p;
t=head;
while(t!=p)
{
cout<<t->data<<" ";
t=t->next;
count1++;//记录走一步的次数
}
do
{
cout<<p->data<<" ";
p=p->next;
}while(p!=s);
p=head2;
for( i=n+2;i<=m;i++)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=i;
s->next=p->next;
p->next=s;
p=s;
}
p->next=head2;
//cout<<p->next->data<<endl;
p=head2;
s=p;
t=head;
while(t!=p)
{
cout<<t->data<<" ";
t=t->next;
count1++;//记录走一步的次数
}
do
{
cout<<p->data<<" ";
p=p->next;
}while(p!=s);
//判断有环否
p=head;
q=head;
do{
p=p->next;
q=q->next->next;
}while(p!=q&&q);
if(q==p) cout<<endl<<"exist loop"<<endl;
cout<<"两个指针环内的交点是:"<<p->data<<endl;
//查找第一个交点
t=q;
p=head;
do
{
s=t;
do
{ s=s->next;
count2++;
}while(s!=q);
if(count2==count1) //防止单链表和循环链表的个数相等。
//count1到交点之前走一步的次数 ,count2从交点之后到次数
{
cout<<"交点是"<<s->data<<endl;
break;
}
else
s=t;
do{
s=s->next;
}while(p!=s&&s!=t);
if(p==s)
{
cout<<"交点是"<<s->data<<endl;
break;
}
p=p->next;
}while(p!=t);
p=head;
q=head;
do{
p=p->next;
q=q->next->next;
}while(p!=q&&q);
if(q==p) cout<<endl<<"exist loop"<<endl;
cout<<"两个指针环内的交点是:"<<p->data<<endl;
//查找第一个交点
t=q;
p=head;
do
{
s=t;
do
{ s=s->next;
count2++;
}while(s!=q);
if(count2==count1) //防止单链表和循环链表的个数相等。
//count1到交点之前走一步的次数 ,count2从交点之后到次数
{
cout<<"交点是"<<s->data<<endl;
break;
}
else
s=t;
do{
s=s->next;
}while(p!=s&&s!=t);
if(p==s)
{
cout<<"交点是"<<s->data<<endl;
break;
}
p=p->next;
}while(p!=t);
}
转载于:https://blog.51cto.com/ertou/223750