#include <iostream>
#include <set>
using namespace std;
struct T_LstNode;
typedef struct T_LstNode
{
int value;
T_LstNode *pNext;
T_LstNode(int v, T_LstNode *next)
{
value = v;
pNext = next;
}
}Node;
//快慢指针来判断
bool hascircle1(Node *hdr)
{
Node *low = hdr;
Node *quick = hdr->pNext;
while (low != quick)
{
if (quick == NULL || quick->pNext == NULL)
{
return false;
}
low = low->pNext;
quick = quick->pNext->pNext;
}
return true;
}
//hashset判断
bool hascircle2(Node *hdr)
{
set<Node *> record;
Node* lst = hdr;
while(lst)
{
if (!record.insert(lst).second)
{
return true;
}
lst = lst->pNext;
}
return false;
}
int main() {
Node *node5 = new Node(5, NULL);
Node *node4 = new Node(4, node5);
Node *node3 = new Node(3, node4);
Node *node2 = new Node(2, node3);
Node *node1 = new Node(1, node2);
bool res1 = hascircle1(node1);
bool res2 = hascircle2(node1);
cout << "res1 = " << res1 << ", res2 = " << res2 << endl;
node5->pNext = node1;
res1 = hascircle1(node1);
res2 = hascircle2(node1);
cout << "res1 = " << res1 << ", res2 = " << res2 << endl;
delete node1;
delete node2;
delete node3;
delete node4;
delete node5;
return 0;
}