对于这个经典问题,最经典的解法莫过于快慢指针 #include <iostream> using namespace std; struct Node { Node(int i = 0, Node *n = NULL) : item(i), next(n) {} int item; Node *next; }; int array[] = {1, -2, 3, 7, -4, 10, 2, -5}; const int size = sizeof array / sizeof *array; Node* construct(int (&array)[size]) { Node dummy; Node *head = &dummy; Node *recurNode; for(int i = 0; i < size; i++) { Node *temp = new Node(array[i]); if(i == 5) recurNode = temp; head->next = temp; head = temp; } if(head->next == NULL) { cout << "right" << endl; head->next = recurNode; } return dummy.next; } void print(Node *head) { while(head) { cout << head->item << " "; head = head->next; } } bool isCircleLink(Node *head) { Node *fast = head, *slow = head; bool flag = false; while(fast != NULL && fast->next != NULL) { if(fast == slow) { if(flag == false) flag = true; else return true; } //想想为什么下面的写法不好 /* if(fast != head && fast == slow) return true; */ //第二次fast == head && fast == slow 的情形,应该判断为circle fast = fast->next->next; slow = slow->next; } return false; } void main() { Node *head = construct(array); //print(head); if(isCircleLink(head)) cout << "circle exists" << endl; else cout << "circle not exist" << endl; } 下面利用hash表的原理来解答,实际上采用set来实现 //本想用hash_set,无奈stl不包含在内, //只好用set来充数。 //这个解法的好处是能求得重复的那个点,这是 //快慢指针所不具备的 bool isCircleLink2(Node *head) { set<Node *> hashNode; if(head == NULL) return false; hashNode.insert(head); head = head->next; while(head) { if(hashNode.find(head) != hashNode.end()) { cout << "the intersection is: " << head->item << endl; return true; } else hashNode.insert(head); head = head->next; } return false; }