📅  最后修改于: 2023-12-03 15:11:17.548000             🧑  作者: Mango
链表是一种常用的数据结构,但在链表实现中,可能会出现循环的情况。循环是指链表中的一部分节点形成了一个环形结构,使得遍历链表时会陷入死循环或者出现无法结束的错误。
为了避免链表循环带来的问题,我们需要编写一个能够检测链表循环的程序。以下是一个基于快慢指针算法的 C++ 程序实现。
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
bool hasCycle(ListNode *head) {
if (head == NULL) {
return false;
}
ListNode *slow = head;
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() {
// 构造一个简单的链表测试程序
ListNode *node1 = new ListNode(1);
ListNode *node2 = new ListNode(2);
ListNode *node3 = new ListNode(3);
ListNode *node4 = new ListNode(4);
ListNode *node5 = new ListNode(5);
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node5;
node5->next = node2; // 构造循环
// 测试循环检测函数
bool has_cycle = hasCycle(node1);
if (has_cycle) {
cout << "链表中存在循环" << endl;
} else {
cout << "链表中不存在循环" << endl;
}
return 0;
}
使用快慢指针算法,将两个指针分别初始化为链表头节点和下一节点,快指针移动步长为2,慢指针移动步长为1,如果存在循环,则快慢指针会在某个时刻相遇。如果链表为空或者链表为单节点,则不存在循环。