剑指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);
}
相关文章推荐
- 【剑指offer】面试题23:链表中环的入口节点
- 剑指Offer面试题56:链表中环的入口节点 Java实现
- 剑指offer面试题56 链表中环的入口节点(java实现)
- 剑指Offer-23:链表中环的入口节点
- 剑指Offer 面试题23:链表中环的入口节点 Java代码实现
- 剑指Offer:链表中环的入口节点
- 剑指offer56题(链表中环的入口节点)
- 剑指Offer—55—链表中环的入口节点
- 剑指offer-面试题56:链表中环的入口结点
- 剑指offer(58):链表中环的入口节点
- 剑指offer----链表中环的入口节点----java实现
- 剑指offer-----链表中环的入口节点(java版)
- 【剑指**】23.链表中环的入口节点
- 剑指offer--链表中环的入口节点(PHP)
- python剑指offer 链表中环的入口节点
- 【剑指Offer学习】【面试题56:链表中环的入口结点】
- 【剑指offer】第二十二题(链表中倒数第 K 个节点) 和 第二十三提(链表中环的入口点)
- 剑指offer--面试题56:链表中环的入口结点
- 剑指offer----链表中环的入口节点
- 【剑指Offer】面试题56:链表中环的入口结点