c 语言判断链表有环,剑指offer之判断链表是否包含环

1 问题

判断链表是否包含环

2 思路

2个指针,一个指针走一步,一个指针走2步,如果相遇则有,反之无。

3 代码实现

#include

#include

#define true 1

#define false 0;

typedef struct node

{

int value;

struct node *next;

}Node;

/*

*判断链表是否有环

*/

int isCircleList(Node *head)

{

if (head == NULL)

{

return false;

}

Node *first = NULL;

Node *second = NULL;

first = head;

second = head;

while (second != NULL && (second->next) != NULL && (second->next->next != NULL))

{

first = first->next;

second = second->next->next;

if (first == second)

{

return true;

}

}

return false;

}

int main()

{

Node *head = NULL;

Node *node1 = NULL;

Node *node2 = NULL;

Node *node3 = NULL;

Node *node4 = NULL;

Node *node5 = NULL;

Node *node6 = NULL;

Node *node7 = NULL;

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

node1 = (Node *)malloc(sizeof(Node));

node2 = (Node *)malloc(sizeof(Node));

node3 = (Node *)malloc(sizeof(Node));

node4 = (Node *)malloc(sizeof(Node));

node5 = (Node *)malloc(sizeof(Node));

node6 = (Node *)malloc(sizeof(Node));

node7 = (Node *)malloc(sizeof(Node));

if (head == NULL || node1 == NULL || node2 == NULL || node3 == NULL

|| node4 == NULL || node5 == NULL || node6 == NULL || node7 == NULL)

{

printf("malloc fail\n");

return false;

}

// node7

// | |

//head->node1->node2->node3->node4

head->value = 0;

head->next = node1;

node1->value = 1;

node1->next = node2;

node2->value = 2;

node2->next = node3;

node3->value = 3;

node3->next = node4;

node4->value = 4;

node4->next = node5;

node5->value = 5;

node5->next = node6;

node6->value = 6;

node6->next = node7;

node7->value = 7;

node7->next = node2;

int result = isCircleList(head);

if (result)

{

printf("list have circle\n");

}

else

{

printf("list do not have circle\n");

}

return true;

}

4 运行结果

list have circle

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值