c语言寻找图中环,检测单链表中是否有环(C语言)

d9540028ae0db7de261c0c129b1ec0d2.png

方法:双指针法思路使用两个指针,两个初始时都指向链表的头结点,然后one指针一次加一,另一个two指针一次加二。在链表有环时,two指针与one指针相等就说明有环。当one指针到达环的起始位置时,two指针已经在环中,此时,由于是环的结构,相当于two指针在追one指针, 由于每two指针每次比one指针快一, 所以,one只需再走两个指针之间的距离的次数,two指针就可以追上one指针。距离小于环的长度。 最终的循环次数小于等于n,最坏情况为n次。所以,时间复杂度是O(n)。图解

7e556f9fff952e290163cecf08ffb5ef.png链表中环检测算法图

当one指针进入环的初始点时,two指针可能已经在环循环多次,此时正好在图中的位置。此时,就可以看成是two指针在追one指针,由于two每次都比比one快1,所以,在图中1的位置可以判断,再经过5次移动,two和one就会处于同一个位置。演示结果与预期一致。代码

#include

#include

//构造结构体

typedef struct list

{

int data;

struct list *next;

}*List,LNode;

//函数声明

List init_list(List head);

int Detection(List head);

void main()

{

List head;

head = (LNode*)malloc(sizeof(LNode));

head = init_list(head);

if(Detection(head))

printf("单链表中有环!\n");

else

printf("单链表中无环!\n");

}

//链表初始化函数

List init_list(List head)

{

int i = 1;

List p = head;

while(i <= 8)

{

List s;

s = (LNode*)malloc(sizeof(LNode));

s->data = i;

s->next = NULL;

p->next = s;

p = p->next;

i++;

}

p->next = head->next->next;

return head->next;

}

//双指针检测单链表中是否有环

int Detection(List head)

{

//0为无环,1为有环

List one = head;

if(head->next == NULL)

return 0;

List two = head->next->next;

while(two != NULL)

{

one = one->next;

two = two->next->next;

if(one == two)

return 1;

}

return 0;

}

举报/反馈

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值