您的位置:首页 > 职场人生

剑指offer--面试题23:链表中环的入口节点

2017-07-15 20:19 495 查看




#include<stdio.h>
#include<malloc.h>

typedef struct LNode
{
int data;
struct LNode *next;
}*LinkList;

LinkList Create_List_Tail(int length,int num)
{//建立链表
LNode *L,*s,*r,*p; //L指向头结点,r指向尾结点,s指向新添加结点
L=(LinkList)malloc(sizeof(LNode));
L->next =NULL;//头结点L->data不存东西
r=L;
for(int i=0;i<length;++i)
{
if(i==num) //入口结点
p=r;

s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&s->data);
r->next =s;
r =s;
}
if(num==length) //环中只有一个元素,指向自己
r->next=r;
else
r->next =p;
return L; //返回链表
}
LNode *MeetingNode(LinkList L)
{
if(!L||!L->next)
return NULL;
LNode *slow=L->next;
LNode *fast=slow->next;
while(fast!=NULL)
{
if(fast==slow)
return fast;
slow=slow->next;
fast=fast->next;
if(fast!=NULL)
fast=fast->next;

}
return NULL;
}
LNode *EntryNode(LinkList L)
{
LNode *p1,*p2,*meet;
int i,loop_num;

meet=MeetingNode(L);
if(!meet)
return NULL;
//得到环中节点的数目
for(loop_num=1,p1=meet; p1->next!=meet; ++loop_num,p1=p1->next);
//p1重新指向开头,p1先移动,步数=环中结点的数目
for(i=0,p1=L->next; i<loop_num; ++i,p1=p1->next);
//再同时移动p1和p2
for(p2=L->next; p1!=p2; p1=p1->next,p2=p2->next);

return p1;
}
void main()
{
LinkList L;
int length,num;
printf("请输入链表长度:");
scanf("%d",&length);
printf("请输入想要设置第几个数为入口结点:");
scanf("%d",&num);
printf("请输入链表元素:");
L=Create_List_Tail(length,num);
printf("入口结点是:%d\n",EntryNode(L)->data);

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: