c++代码实现
#include <iostream>
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* findCycleEntry(ListNode* head) {
if (!head || !head->next) {
return nullptr;
}
// 初始化快慢指针
ListNode* slow = head;
ListNode* fast = head;
// 快慢指针相遇点
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
// 如果快指针追上了慢指针,说明存在环
if (slow == fast) {
break;
}
}
// 如果快指针到达链表末尾,没有环
if (!fast || !fast->next) {
return nullptr;
}
// 重新将其中一个指针指向链表头部
slow = head;
// 两个指针以相同速度前进,直到再次相遇,相遇点即为环的入口点
while (slow != fast) {
slow = slow->next;
fast = fast->next;
}
return slow; // 返回环的入口点
}
void deleteLinkedList(ListNode* head) {
while (head) {
ListNode* temp = head;
head = head->next;
delete temp;
}
}
int main() {
// 示例:创建一个带环的链表
ListNode* node1 = new ListNode(1);
ListNode* node2 = new ListNode(2);
ListNode* node3 = new ListNode(3);
ListNode* node4 = new ListNode(4);
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node2; // 创建环
ListNode* entry = findCycleEntry(node1);
if (entry) {
std::cout << "Cycle entry value: " << entry->val << std::endl;
} else {
std::cout << "No cycle detected." << std::endl;
}
// 释放链表内存
deleteLinkedList(node1);
return 0;
}