#include <bits/stdc++.h>
using namespace std;
class Node
{
public:
int data;
Node *next;
Node(int d)
{
data = d;
next = NULL;
}
};
// head - Head pointer of the Linked List
// Return a boolean value indicating the presence of cycle
// If the cycle is present, modify the linked list to remove the cycle as well
bool floydCycleRemoval(Node *head)
{
/* Code here */
Node *slow=head;
Node *fast=head;
while(fast!=NULL || fast->next!=NULL){
fast=fast->next->next;
slow=slow->next;
if(slow==fast){
Node* temp = fast;
slow = head;
while(temp!=slow){
temp=temp->next;
slow=slow->next;
}
while(temp->next!=slow){
temp = temp->next;
}
temp->next=NULL;
return true;
}
}
return false;
}
void buildCycleList(Node *&head)
{
unordered_map<int, Node *> hash;
int x;
cin >> x;
if (x == -1)
{
head = NULL;
return;
}
head = new Node(x);
hash[x] = head;
Node *current = head;
while (x != -1)
{
cin >> x;
if (x == -1)
break;
if (hash.find(x) != hash.end())
{
current->next = hash[x];
return;
}
Node *n = new Node(x);
current->next = n;
current = n;
hash[x] = n;
}
current->next = NULL;
}
void printLinkedList(Node *head)
{
unordered_set<int> s;
while (head != NULL)
{
if (s.find(head->data) != s.end())
{
cout << "\nCycle detected at " << head->data;
return;
}
cout << head->data << " ";
s.insert(head->data);
head = head->next;
}
}
int main()
{
Node *head = NULL;
buildCycleList(head);
bool cyclePresent = floydCycleRemoval(head);
if (cyclePresent)
{
cout << "Cycle was present\n";
}
else
{
cout << "No cycle\n";
}
cout << "Linked List - ";
printLinkedList(head);
return 0;
}
CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgTm9kZQp7CnB1YmxpYzoKICAgIGludCBkYXRhOwogICAgTm9kZSAqbmV4dDsKICAgIE5vZGUoaW50IGQpCiAgICB7CiAgICAgICAgZGF0YSA9IGQ7CiAgICAgICAgbmV4dCA9IE5VTEw7CiAgICB9Cn07CgovLyBoZWFkIC0gSGVhZCBwb2ludGVyIG9mIHRoZSBMaW5rZWQgTGlzdAovLyBSZXR1cm4gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIGN5Y2xlCi8vIElmIHRoZSBjeWNsZSBpcyBwcmVzZW50LCBtb2RpZnkgdGhlIGxpbmtlZCBsaXN0IHRvIHJlbW92ZSB0aGUgY3ljbGUgYXMgd2VsbApib29sIGZsb3lkQ3ljbGVSZW1vdmFsKE5vZGUgKmhlYWQpCnsKICAgIC8qIENvZGUgaGVyZSAqLwogICAgTm9kZSAqc2xvdz1oZWFkOwogICAgTm9kZSAqZmFzdD1oZWFkOwogICAgd2hpbGUoZmFzdCE9TlVMTCB8fCBmYXN0LT5uZXh0IT1OVUxMKXsKICAgICAgICBmYXN0PWZhc3QtPm5leHQtPm5leHQ7CiAgICAgICAgc2xvdz1zbG93LT5uZXh0OwogICAgICAgIGlmKHNsb3c9PWZhc3QpewogICAgICAgICAgIE5vZGUqIHRlbXAgPSBmYXN0OwogICAgICAgICAgIHNsb3cgPSBoZWFkOwogICAgICAgICAgIHdoaWxlKHRlbXAhPXNsb3cpewogICAgICAgICAgICB0ZW1wPXRlbXAtPm5leHQ7CiAgICAgICAgICAgIHNsb3c9c2xvdy0+bmV4dDsKICAgICAgICB9CiAgICAgICAgd2hpbGUodGVtcC0+bmV4dCE9c2xvdyl7CiAgICAgICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OwogICAgICAgIH0KICAgICAgICB0ZW1wLT5uZXh0PU5VTEw7CiAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKCnZvaWQgYnVpbGRDeWNsZUxpc3QoTm9kZSAqJmhlYWQpCnsKICAgIHVub3JkZXJlZF9tYXA8aW50LCBOb2RlICo+IGhhc2g7CiAgICBpbnQgeDsKICAgIGNpbiA+PiB4OwogICAgaWYgKHggPT0gLTEpCiAgICB7CiAgICAgICAgaGVhZCA9IE5VTEw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaGVhZCA9IG5ldyBOb2RlKHgpOwogICAgaGFzaFt4XSA9IGhlYWQ7CiAgICBOb2RlICpjdXJyZW50ID0gaGVhZDsKICAgIHdoaWxlICh4ICE9IC0xKQogICAgewogICAgICAgIGNpbiA+PiB4OwogICAgICAgIGlmICh4ID09IC0xKQogICAgICAgICAgICBicmVhazsKICAgICAgICBpZiAoaGFzaC5maW5kKHgpICE9IGhhc2guZW5kKCkpCiAgICAgICAgewogICAgICAgICAgICBjdXJyZW50LT5uZXh0ID0gaGFzaFt4XTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBOb2RlICpuID0gbmV3IE5vZGUoeCk7CiAgICAgICAgY3VycmVudC0+bmV4dCA9IG47CiAgICAgICAgY3VycmVudCA9IG47CiAgICAgICAgaGFzaFt4XSA9IG47CiAgICB9CiAgICBjdXJyZW50LT5uZXh0ID0gTlVMTDsKfQoKdm9pZCBwcmludExpbmtlZExpc3QoTm9kZSAqaGVhZCkKewogICAgdW5vcmRlcmVkX3NldDxpbnQ+IHM7CiAgICB3aGlsZSAoaGVhZCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChzLmZpbmQoaGVhZC0+ZGF0YSkgIT0gcy5lbmQoKSkKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgIlxuQ3ljbGUgZGV0ZWN0ZWQgYXQgIiA8PCBoZWFkLT5kYXRhOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgaGVhZC0+ZGF0YSA8PCAiICI7CiAgICAgICAgcy5pbnNlcnQoaGVhZC0+ZGF0YSk7CiAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgTm9kZSAqaGVhZCA9IE5VTEw7CgogICAgYnVpbGRDeWNsZUxpc3QoaGVhZCk7CgogICAgYm9vbCBjeWNsZVByZXNlbnQgPSBmbG95ZEN5Y2xlUmVtb3ZhbChoZWFkKTsKICAgIGlmIChjeWNsZVByZXNlbnQpCiAgICB7CiAgICAgICAgY291dCA8PCAiQ3ljbGUgd2FzIHByZXNlbnRcbiI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgY291dCA8PCAiTm8gY3ljbGVcbiI7CiAgICB9CgogICAgY291dCA8PCAiTGlua2VkIExpc3QgLSAiOwogICAgcHJpbnRMaW5rZWRMaXN0KGhlYWQpOwoKICAgIHJldHVybiAwOwp9Cg==