c函数,判断链表中是否有环?

快慢指针,用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步;  当p2 指针追上 p1的时候,就表明链表当中有环路了。

功能函数

int testLinkRing(linkp head)    //head为链表头结点
{
    linkp t1=head, t2=head;
    while( t1->next && t2->next)
    {
        t1 = t1->next;                            //t1走一步
        if (NULL == (t2 = t2->next->next))        //t2走两步
            return 0;   //无环
        if (t1 == t2)
            return 1;
    }
    return 0;
}

测试代码

#include <stdio.h>
#include <stdlib.h>


typedef struct link
{
    struct link *front;
    struct link *next;

}linkn, *linkp;

linkp create(void)
{
    linkp node = malloc(sizeof(linkn));
    node->next = NULL;
    return node;
}

int testLinkRing(linkp head)
{
    linkp t1=head, t2=head;
    while( t1->next && t2->next)
    {
        t1 = t1->next;
        if (NULL == (t2 = t2->next->next))
            return 0;   //无环
        if (t1 == t2)
            return 1;
    }
    return 0;
}


int destory(linkp head)        //回收
{
	//释放所有的结点
	linkp lp = head->next;
    linkp tmp = NULL;
	
	while(head->next != NULL)
	{
        tmp = lp;
		head->next=lp->next;
        lp = lp->next;
		free(tmp);
	}
	free(head);
	//让主函数的链表头指针指向NULL;
    lp = NULL;
	head = NULL;

	return 0;
}
int main(int argc, char *argv[])
{ 
    linkp head = create();
    linkp lp = head;
    for(int i = 0; i < 4; i++)
    {
        lp->next=create();
        lp = lp->next;
    }
    lp->next = head;                    //连环
    int ret = testLinkRing(head);
    if(ret = 1)
    {
        printf("is a ring\n");
    }
    else
    {
        printf("is not\n");
    }
    lp->next=NULL;                    //解环
    ret = testLinkRing(head);
    if(ret == 1)
    {
        printf("is a ring\n");
    }
    else
    {
        printf("is not\n");
    }

    destory(head);
    return 0;

测试结果

is a ring
is not

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断链表是否有环,可以使用快慢指针的方法。具体来说,可以用两个指针,一个指针每次向前移动1个节点,另一个指针每次向前移动2个节点。如果存在环,那么这两个指针最终一定会相遇。 以下是详细的C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> // 链表节点结构体 struct ListNode { int val; struct ListNode *next; }; // 判断链表是否有环 bool hasCycle(struct ListNode *head) { if (head == NULL) { return false; } struct ListNode *slow = head; struct ListNode *fast = head->next; while (fast != NULL && fast->next != NULL) { if (slow == fast) { return true; } slow = slow->next; fast = fast->next->next; } return false; } int main() { // 创建链表 struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode)); head->val = 1; head->next = NULL; struct ListNode *node1 = (struct ListNode *)malloc(sizeof(struct ListNode)); node1->val = 2; head->next = node1; struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode)); node2->val = 3; node1->next = node2; struct ListNode *node3 = (struct ListNode *)malloc(sizeof(struct ListNode)); node3->val = 4; node2->next = node3; // 构造环 node3->next = node1; // 判断链表是否有环 if (hasCycle(head)) { printf("链表有环\n"); } else { printf("链表无环\n"); } return 0; } ``` 在上面的代码,我们先创建了一个包含4个节点的链表,并构造了一个环。然后使用`hasCycle()`函数判断链表是否有环,最终输出结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值