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

来源:互联网 发布:手机淘宝货源一件代发 编辑:程序博客网 时间:2024/04/27 21:48


#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;elser->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和p2for(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);}


阅读全文
0 0