环形链表(快慢指针)

简介: 环形链表(快慢指针)

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false

#include <stdbool.h>
struct ListNode {
    int val;
    struct ListNode *next;
};
bool hasCycle(struct ListNode *head) {
    if (!head || !head->next) {
        return false; // 链表为空或只有一个节点,肯定没有环
    }
    struct ListNode *slow = head;
    struct ListNode *fast = head->next;
    while (slow != fast) {
        if (!fast || !fast->next) {
            return false; // 如果快指针或快指针的下一个节点为NULL,说明没有环
        }
        slow = slow->next;
        fast = fast->next->next;
    }
    return true; // 如果能跳出循环,说明有环
}

这里同样使用了快慢指针的方法,注意在C语言中要使用 struct 来定义链表节点。算法思想和Python版本相同,只是语法有所不同。

如果你想测试上述 C 代码,可以创建一个简单的链表,并手动设置环。以下是一个例子:

#include <stdio.h>
#include <stdbool.h>
struct ListNode {
    int val;
    struct ListNode *next;
};
bool hasCycle(struct ListNode *head);
int main() {
    // 创建链表:1 -> 2 -> 3 -> 4 -> 5 -> 2(与节点3相同,形成环)
    struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
    head->val = 1;
    struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node2->val = 2;
    head->next = node2;
    struct ListNode *node3 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node3->val = 3;
    node2->next = node3;
    struct ListNode *node4 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node4->val = 4;
    node3->next = node4;
    struct ListNode *node5 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node5->val = 5;
    node4->next = node5;
    // 设置环
    node5->next = node2;
    // 测试是否有环
    if (hasCycle(head)) {
        printf("链表中存在环。\n");
    } else {
        printf("链表中不存在环。\n");
    }
    // 释放节点内存
    free(head);
    free(node2);
    free(node3);
    free(node4);
    free(node5);
    return 0;
}

在这个例子中,我们手动创建了一个包含五个节点的链表,并设置第五个节点指向第二个节点,形成了一个环。当运行程序时,输出应该是 "链表中存在环"。

 

相关文章
|
2月前
链表指针的传参,传值和传地址
本文讨论了链表操作中指针传参的问题,特别是指针的传值与传地址的区别,并提供了修正代码,以确保链表插入操作能正确地修改指针指向的地址。
19 1
链表指针的传参,传值和传地址
|
1月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
39 1
|
7月前
|
存储 C语言
用指针处理链表
用指针处理链表
69 3
|
6月前
|
Java
环形数组链表(java)
环形数组链表(java)
|
2月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
36 0
|
2月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
30 0
|
5月前
【数据结构OJ题】环形链表
力扣题目——环形链表
41 3
【数据结构OJ题】环形链表
|
5月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
55 1
【数据结构OJ题】复制带随机指针的链表
|
5月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
35 1
【数据结构OJ题】环形链表II
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
65 2