问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

程序员面试笔试宝典 判断链表是否有环

发布网友 发布时间:2022-04-26 14:56

我来回答

1个回答

热心网友 时间:2023-04-28 13:42

1.判断链表否环
设置两指针slowfast,初始值均指向链表,slow每向前走步,fast每向前走两步.
链表环,则fast先进入环,slow进入环,两指针环必定相遇.
slow与fast没相遇,fast遍历链表尾部,则表示链表没环.

2.链表环,确定环入口点
设置slow指针指向链表,fast指向相遇点,每两指针都走步,两指针必定相遇,
则相遇第点环入口点.

3.计算环
环入口点设置指针计数器,让指针环面走,每走步,计数器加1,
指针环入口点候,计数器值环.

测试结:

链表1:
10 20 30 40 50 20 30 40 50 20 30 40 50 20 30 40 50 20 30 40
环入口点: 20
环: 4

链表2:
1 2 3 4 5
链表没环

//C语言测试程序
#include
#include

typedef struct Node
{
int data;
struct Node *next;
}Node,*LinkList;

//创建链表("环")
LinkList CreateLinkWithLoop()
{
LinkList head; //链表
Node *newNode; //新结点
Node *ptr; //指向前结点
Node *pEntry; //指向"环"入口

newNode=(Node *)malloc(sizeof(Node));
newNode->data=10;
newNode->next=NULL;
head=newNode; //设置链表
ptr=newNode;

newNode=(Node *)malloc(sizeof(Node));
newNode->data=20;
newNode->next=NULL;
ptr->next=newNode;
ptr=newNode;
pEntry=newNode; //指向"环"入口

newNode=(Node *)malloc(sizeof(Node));
newNode->data=30;
newNode->next=NULL;
ptr->next=newNode;
ptr=newNode;

newNode=(Node *)malloc(sizeof(Node));
newNode->data=40;
newNode->next=NULL;
ptr->next=newNode;
ptr=newNode;

newNode=(Node *)malloc(sizeof(Node));
newNode->data=50;
newNode->next=pEntry; //产"环"
ptr->next=newNode;
ptr=newNode;

return head;
}

//创建链表(没"环")
LinkList CreateLink()
{
LinkList head; //链表
Node *newNode; //新结点
Node *ptr; //指向前结点
int i;

newNode=(Node *)malloc(sizeof(Node));
newNode->data=1;
newNode->next=NULL;
head=newNode; //设置链表
ptr=newNode;

for(i=2;i<=5;i++)
{
newNode=(Node *)malloc(sizeof(Node));
newNode->data=i;
newNode->next=NULL;
ptr->next=newNode;
ptr=newNode;
}

return head;
}

//打印链表
void PrintLink(LinkList head)
{
LinkList ptr;
int nCount=0;

ptr=head;
while(ptr!=NULL)
{
printf("%d ",ptr->data);
ptr=ptr->next;
nCount++;
if(nCount>=20)
{
break;
}
}
printf("\n");
}

//判断链表否"环",确定"环"入口点
LinkList CheckLinkLoop(LinkList head)
{
LinkList fast;
LinkList slow;
int isLoop=0;

fast=head;
slow=head;

while(fast != NULL && fast->next != NULL)
{
//fast每走两步,slow每走步
//两指针相等,表示链表"环"
slow=slow->next;
fast=fast->next->next;
if(fast == slow)
{
isLoop=1;
break;
}
}
if(isLoop==1) //"环"
{
//slow指向链表,fast指向相遇点,两指针每都走步
//两指针第相等,环入口点
slow=head;
while(slow != fast)
{
slow=slow->next;
fast=fast->next;
}
return slow;
}
else //没"环"
{
return NULL;
}
}

//计算环
int GetLoopSize(LinkList entryNode)
{
LinkList ptr;
int nCount=0;

ptr=entryNode->next;
nCount++;

while(ptr!=entryNode)
{
nCount++;
ptr=ptr->next;
}

return nCount;
}

int main()
{
LinkList head_1;
LinkList head_2;
LinkList ret_1;
LinkList ret_2;
int loopSize_1;
int loopSize_2;

head_1=CreateLinkWithLoop(); //创建链表("环")

printf("链表1:\n");
PrintLink(head_1); //打印链表

ret_1=CheckLinkLoop(head_1);
if(ret_1!=NULL)
{
printf("环入口点: %d\n",ret_1->data);
loopSize_1=GetLoopSize(ret_1);
printf("环: %d\n",loopSize_1);
}
else
{
printf("链表没环\n");
}

head_2=CreateLink(); //创建链表(没"环")

printf("\n链表2:\n");
PrintLink(head_2); //打印链表

ret_2=CheckLinkLoop(head_2);
if(ret_2 != NULL)
{
printf("环入口点: %d\n",ret_2->data);
loopSize_2=GetLoopSize(ret_2);
printf("环: %d\n",loopSize_2);
}
else
{
printf("链表没环\n");
}

return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
行车工退休是否有工龄年限限制?男士、女士的的退休年龄。 北京中新惠尔健康科技有限公司解决方案 北京中新惠尔健康科技有限公司公司文化 北京中新惠尔健康科技有限公司服务产品 北京中新惠尔健康科技有限公司历史沿革 北京中新惠尔健康科技有限公司惠尔简介 速腾能放多久? 昆山汽车搭电多少钱? 比亚迪救急估计电瓶没电了 盒马员工超过1小时算不算大吧 程序员面试宝典 剑指offer 编程之美 哪本书好 c程序员面试题 求C和C++程序员面试秘笈 pdf 程序员面试笔试宝典的目录 c/c++程序员面试宝典和程序员面试宝典哪个好 c/c++程序员面试宝典怎么样 服务行业最重要的是什么? 排骨做的时候,应该怎样去异味呢? 干服务行业最重要的事什么? 为什么年轻人不愿意往服务业发展? 服务行业读书心得 琥珀木手串风水作用 中国服务业工作者为何让人感觉态度很差? 琥珀木手串为什么要晒太阳? 为什么觉得自己适合服务行业我该怎么回答 琥珀木手串有收藏价值吗? 琥珀木手串怎么固化 制作糯米香肠时,都要注意什么? 做服务行业真的就只能忍气吞声吗? 琥珀木手串值钱吗 谁有《程序员面试宝典-欧立奇》电子书百度网盘资源下载 C++程序员如何才能面试成功? 我要做C&#47;C++程序员,但笔试后的面试老是不过,我该补充那些知识点?网络,数据库,操作系统,数据结构算法 江西移动宽带套餐价格表2021? 移动宽带提速15元/月是什么意思 中国移动送宽带要收15元的电視费合法吗 江西移动最低消费128另加每月15元才能有宽带 江西移动宽带多少钱一个月,? 缴了整年的江西移动宽带费用,今天收到十一月的账单。 我家里装的移动宽带,同时开通了网络电视,每月15元,这种网络电视可以取消吗? 江西移动网络宽带不包年。包月多少钱,不用可报停吗?如随意上网怎么计费 日式煎饺的做法步骤图,日式煎饺怎么做好吃 香煎饺子的做法,怎么做,如何做,图解详细步骤–菜谱 平安好货是不是正规公司? 平安好贷总部在哪里 平安好贷是平安银行的吗 平安好贷是真的假的 请问:福彩3d三组每天包十个号能中奖吗?请高手指点...谢谢! 福彩3d个十百位指哪些 问一下,3D组选三,把十个号全包了才180元,组选三的奖金是333,是否盈利啊?