【快慢指针】C语言解决链表是否有环

编程探索课程 2024-03-03 06:00:43

使用快慢指针(双指针)是一种常见的方法来检测链表是否有环。以下是C语言示例代码,展示了如何使用快慢指针来判断链表中是否存在环:

一图胜千言

废话不说,上代码:

#include <stdio.h>#include <stdbool.h>#include <stdlib.h>// 定义链表节点结构体typedef struct Node { int data; struct Node* next;} Node;// 创建链表节点Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode;}// 添加节点到链表尾部void append(Node** headRef, int data) { Node* newNode = createNode(data); if (*headRef == NULL) { *headRef = newNode; return; } Node* current = *headRef; while (current->next != NULL) { current = current->next; } current->next = newNode;}// 检测链表是否有环bool hasCycle(Node* head) { if (head == NULL || head->next == NULL) { return false; } Node* slow = head; Node* fast = head->next; while (fast != NULL && fast->next != NULL) { if (slow == fast) { return true; // 快慢指针相遇,存在环 } slow = slow->next; // 慢指针移动一步 fast = fast->next->next; // 快指针移动两步 } return false; // 快指针遍历结束,未发现环}// 释放链表内存void freeLinkedList(Node* head) { Node* current = head; while (current != NULL) { Node* temp = current; current = current->next; free(temp); }}int main() { Node* head = NULL; // 创建一个有环的链表 append(&head, 1); append(&head, 2); append(&head, 3); append(&head, 4); append(&head, 5); // 创建环 head->next->next->next->next->next = head->next; // 检测链表是否有环并输出结果 if (hasCycle(head)) { printf("The linked list has a cycle.\n"); } else { printf("The linked list does not have a cycle.\n"); } // 释放链表内存 freeLinkedList(head); return 0;}

运行结果:

code is cheap

在此示例中,hasCycle 函数使用了快慢指针的方法来检测链表中是否存在环。快指针每次移动两步,慢指针每次移动一步,如果存在环,两指针最终会相遇。main 函数创建了一个有环的链表,并调用 hasCycle 函数来检测是否存在环。

通过这种方式,快慢指针可以在不使用额外空间的情况下有效地检测链表中是否存在环。

0 阅读:2

编程探索课程

简介:感谢大家的关注