// Detect_Remove_Loop_LList.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
class Node{
int data;
public:
Node *pNext;
Node():data(0),pNext(NULL){};
Node(int n){
data = n;
}
};
bool FindAndRemoveLoopInList(Node **nodesList)
{
//make sure nodeslist is not null or single valued
if(*nodesList == NULL || (*nodesList)->pNext == NULL)
return false;
bool bResult = false;
Node *slowNode = *nodesList , *fastNode = (*nodesList); Node *prevSlowNode = NULL;
while(slowNode != NULL && fastNode != NULL){ //This condition will become false if there is no loop in list
if(fastNode->pNext ==NULL)
break;
//Slownode advances by one and fastnode advances by two
//Save prevSlowNode to make use of it in remove loop case
prevSlowNode = slowNode;
slowNode = slowNode->pNext;
fastNode = fastNode->pNext->pNext;
if(slowNode == fastNode)
{
bResult = true;
break;
}
}
//To remove loop in the list
if(bResult)
{
/*Move fastNode to start node and move both nodes at same pace now.
They will meet at head node of loop.*/
fastNode = *nodesList;
while(fastNode != slowNode)
{
prevSlowNode = slowNode;
slowNode = slowNode->pNext;
fastNode = fastNode->pNext;
}
//Loop head is at slownode position now.Make its prev node to null.
prevSlowNode->pNext = NULL;
}
return bResult;
}
void CleanupList(Node *llist)
{
while(llist != NULL)
{
Node *tempNode = llist;
llist = llist->pNext;
delete tempNode;
}
}
int main(int argc, char* argv[])
{
Node *nodes=NULL;
//Create some list with 10 nodes
for(int i=0;i<10;i++)
{
int n = i+rand()%50;
Node *node = new Node(n);
node->pNext = NULL;
if(nodes == NULL)
nodes = node;
else
{
node->pNext=nodes;
nodes= node;
}
}
//Lets make a loop to the last element to second element
Node *tmpNode = NULL;
for(tmpNode = nodes;tmpNode->pNext != NULL;tmpNode=tmpNode->pNext);
tmpNode->pNext = nodes->pNext;
bool bResult = FindAndRemoveLoopInList(&nodes);
if(bResult)
cout<<"Loop has been detected and removed!!"<<endl;
else
cout<<"No loop found"<<endl;
//Cleanup allocated memory
CleanupList(nodes);
return 0;
}