Detectar y eliminar bucles en una lista vinculada

Escriba una función detectAndRemoveLoop() que compruebe si una lista enlazada determinada contiene un bucle y, si el bucle está presente, lo elimina y devuelve verdadero. Si la lista no contiene un bucle, devuelve falso. El siguiente diagrama muestra una lista enlazada con un bucle. detectAndRemoveLoop() debe cambiar la lista siguiente a 1->2->3->4->5->NULL.

C++

#include <bits/stdc++.h>
using namespace std;
  
/* Link list node */
struct Node {
    int data;
    struct Node* next;
};
  
/* Function to remove loop. */
void removeLoop(struct Node*, struct Node*);
  
/* This function detects and removes loop in the list
  If loop was there in the list then it returns 1,
  otherwise returns 0 */
int detectAndRemoveLoop(struct Node* list)
{
    struct Node *slow_p = list, *fast_p = list;
  
    // Iterate and find if loop exists or not
    while (slow_p && fast_p && fast_p->next) {
        slow_p = slow_p->next;
        fast_p = fast_p->next->next;
  
        /* If slow_p and fast_p meet at some point then there
           is a loop */
        if (slow_p == fast_p) {
            removeLoop(slow_p, list);
  
            /* Return 1 to indicate that loop is found */
            return 1;
        }
    }
  
    /* Return 0 to indicate that there is no loop*/
    return 0;
}
  
/* Function to remove loop.
 loop_node --> Pointer to one of the loop nodes
 head -->  Pointer to the start node of the linked list */
void removeLoop(struct Node* loop_node, struct Node* head)
{
    struct Node* ptr1 = loop_node;
    struct Node* ptr2 = loop_node;
  
    // Count the number of nodes in loop
    unsigned int k = 1, i;
    while (ptr1->next != ptr2) {
        ptr1 = ptr1->next;
        k++;
    }
  
    // Fix one pointer to head
    ptr1 = head;
  
    // And the other pointer to k nodes after head
    ptr2 = head;
    for (i = 0; i < k; i++)
        ptr2 = ptr2->next;
  
    /*  Move both pointers at the same pace,
      they will meet at loop starting node */
    while (ptr2 != ptr1) {
        ptr1 = ptr1->next;
        ptr2 = ptr2->next;
    }
  
    // Get pointer to the last node
    while (ptr2->next != ptr1)
        ptr2 = ptr2->next;
  
    /* Set the next node of the loop ending node
      to fix the loop */
    ptr2->next = NULL;
}
  
/* Function to print linked list */
void printList(struct Node* node)
{
    // Print the list after loop removal
    while (node != NULL) {
        cout << node->data << " ";
        node = node->next;
    }
}
  
struct Node* newNode(int key)
{
    struct Node* temp = new Node();
    temp->data = key;
    temp->next = NULL;
    return temp;
}
  
// Driver Code
int main()
{
    struct Node* head = newNode(50);
    head->next = newNode(20);
    head->next->next = newNode(15);
    head->next->next->next = newNode(4);
    head->next->next->next->next = newNode(10);
  
    /* Create a loop for testing */
    head->next->next->next->next->next = head->next->next;
  
    detectAndRemoveLoop(head);
  
    cout << "Linked List after removing loop \n";
    printList(head);
    return 0;
}
  
// This code has been contributed by Striver

Java

// Java program to detect and remove loop in linked list
  
class LinkedList {
  
    static Node head;
  
    static class Node {
  
        int data;
        Node next;
  
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    // Function that detects loop in the list
    int detectAndRemoveLoop(Node node)
    {
        Node slow = node, fast = node;
        while (slow != null && fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
  
            // If slow and fast meet at same point then loop is present
            if (slow == fast) {
                removeLoop(slow, node);
                return 1;
            }
        }
        return 0;
    }
  
    // Function to remove loop
    void removeLoop(Node loop, Node head)
    {
        Node ptr1 = loop;
        Node ptr2 = loop;
  
        // Count the number of nodes in loop
        int k = 1, i;
        while (ptr1.next != ptr2) {
            ptr1 = ptr1.next;
            k++;
        }
  
        // Fix one pointer to head
        ptr1 = head;
  
        // And the other pointer to k nodes after head
        ptr2 = head;
        for (i = 0; i < k; i++) {
            ptr2 = ptr2.next;
        }
  
        /*  Move both pointers at the same pace,
         they will meet at loop starting node */
        while (ptr2 != ptr1) {
            ptr1 = ptr1.next;
            ptr2 = ptr2.next;
        }
  
        // Get pointer to the last node
        while (ptr2.next != ptr1) {
            ptr2 = ptr2.next;
        }
  
        /* Set the next node of the loop ending node
         to fix the loop */
        ptr2.next = null;
    }
  
    // Function to print the linked list
    void printList(Node node)
    {
        while (node != null) {
            System.out.print(node.data + " ");
            node = node.next;
        }
    }
  
    // Driver program to test above functions
    public static void main(String[] args)
    {
        LinkedList list = new LinkedList();
        list.head = new Node(50);
        list.head.next = new Node(20);
        list.head.next.next = new Node(15);
        list.head.next.next.next = new Node(4);
        list.head.next.next.next.next = new Node(10);
  
        // Creating a loop for testing
        head.next.next.next.next.next = head.next.next;
        list.detectAndRemoveLoop(head);
        System.out.println("Linked List after removing loop : ");
        list.printList(head);
    }
}
  
// This code has been contributed by Mayank Jaiswal

Python3

# Python program to detect and remove loop in linked list
  
# Node class 
class Node:
  
    # Constructor to initialize the node object
    def __init__(self, data):
        self.data = data
        self.next = None
  
class LinkedList:
  
    # Function to initialize head
    def __init__(self):
        self.head = None
  
    def detectAndRemoveLoop(self):
        slow_p = fast_p = self.head
          
        while(slow_p and fast_p and fast_p.next):
            slow_p = slow_p.next
            fast_p = fast_p.next.next
  
            # If slow_p and fast_p meet at some point then
            # there is a loop
            if slow_p == fast_p:
                self.removeLoop(slow_p)
          
                # Return 1 to indicate that loop is found
                return 1
          
        # Return 0 to indicate that there is no loop
        return 0 
  
    # Function to remove loop
    # loop_node --> pointer to one of the loop nodes
    # head --> Pointer to the start node of the linked list
    def removeLoop(self, loop_node):
        ptr1 = loop_node
        ptr2 = loop_node
          
        # Count the number of nodes in loop
        k = 1 
        while(ptr1.next != ptr2):
            ptr1 = ptr1.next
            k += 1
  
        # Fix one pointer to head
        ptr1 = self.head
          
        # And the other pointer to k nodes after head
        ptr2 = self.head
        for i in range(k):
            ptr2 = ptr2.next
  
        # Move both pointers at the same place
        # they will meet at loop starting node
        while(ptr2 != ptr1):
            ptr1 = ptr1.next
            ptr2 = ptr2.next
  
        # Get pointer to the last node
        while(ptr2.next != ptr1):
            ptr2 = ptr2.next
  
        # Set the next node of the loop ending node
        # to fix the loop
        ptr2.next = None
  
    # Function to insert a new node at the beginning
    def push(self, new_data):
        new_node = Node(new_data)
        new_node.next = self.head
        self.head = new_node
  
    # Utility function to print the LinkedList
    def printList(self):
        temp = self.head
        while(temp):
            print(temp.data, end = ' ')
            temp = temp.next
  
  
# Driver program
llist = LinkedList()
llist.push(10)
llist.push(4)
llist.push(15)
llist.push(20)
llist.push(50)
  
# Create a loop for testing
llist.head.next.next.next.next.next = llist.head.next.next
  
llist.detectAndRemoveLoop()
  
print("Linked List after removing loop")
llist.printList()
  
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)

C#

// A C# program to detect and remove loop in linked list
using System;
public class LinkedList {
  
    Node head;
  
    public class Node {
  
        public int data;
        public Node next;
  
        public Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    // Function that detects loop in the list
    int detectAndRemoveLoop(Node node)
    {
        Node slow = node, fast = node;
        while (slow != null && fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
  
            // If slow and fast meet at same
            // point then loop is present
            if (slow == fast) {
                removeLoop(slow, node);
                return 1;
            }
        }
        return 0;
    }
  
    // Function to remove loop
    void removeLoop(Node loop, Node head)
    {
        Node ptr1 = loop;
        Node ptr2 = loop;
  
        // Count the number of nodes in loop
        int k = 1, i;
        while (ptr1.next != ptr2) {
            ptr1 = ptr1.next;
            k++;
        }
  
        // Fix one pointer to head
        ptr1 = head;
  
        // And the other pointer to k nodes after head
        ptr2 = head;
        for (i = 0; i < k; i++) {
            ptr2 = ptr2.next;
        }
  
        /* Move both pointers at the same pace, 
        they will meet at loop starting node */
        while (ptr2 != ptr1) {
            ptr1 = ptr1.next;
            ptr2 = ptr2.next;
        }
  
        // Get pointer to the last node
        while (ptr2.next != ptr1) {
            ptr2 = ptr2.next;
        }
  
        /* Set the next node of the loop ending node 
        to fix the loop */
        ptr2.next = null;
    }
  
    // Function to print the linked list
    void printList(Node node)
    {
        while (node != null) {
            Console.Write(node.data + " ");
            node = node.next;
        }
    }
  
    // Driver program to test above functions
    public static void Main(String[] args)
    {
        LinkedList list = new LinkedList();
        list.head = new Node(50);
        list.head.next = new Node(20);
        list.head.next.next = new Node(15);
        list.head.next.next.next = new Node(4);
        list.head.next.next.next.next = new Node(10);
  
        // Creating a loop for testing
        list.head.next.next.next.next.next = list.head.next.next;
        list.detectAndRemoveLoop(list.head);
        Console.WriteLine("Linked List after removing loop : ");
        list.printList(list.head);
    }
}
  
// This code contributed by Rajput-Ji

Javascript

<script>
  
// Javascript program to detect and
// remove loop in linked list
var head;
  
class Node 
{
    constructor(val)
    {
        this.data = val;
        this.next = null;
    }
}
  
// Function that detects loop in the list
function detectAndRemoveLoop(node)
{
    var slow = node, fast = node;
    while (slow != null && 
           fast != null && 
           fast.next != null) 
    {
        slow = slow.next;
        fast = fast.next.next;
  
        // If slow and fast meet at same 
        // point then loop is present
        if (slow == fast) 
        {
            removeLoop(slow, node);
            return 1;
        }
    }
    return 0;
}
  
// Function to remove loop
function removeLoop(loop, head)
{
    var ptr1 = loop;
    var ptr2 = loop;
  
    // Count the number of nodes in loop
    var k = 1, i;
      
    while (ptr1.next != ptr2) 
    {
        ptr1 = ptr1.next;
        k++;
    }
  
    // Fix one pointer to head
    ptr1 = head;
  
    // And the other pointer to 
    // k nodes after head
    ptr2 = head;
    for(i = 0; i < k; i++)
    {
        ptr2 = ptr2.next;
    }
  
    /*  Move both pointers at the same pace,
     they will meet at loop starting node */
    while (ptr2 != ptr1)
    {
        ptr1 = ptr1.next;
        ptr2 = ptr2.next;
    }
  
    // Get pointer to the last node
    while (ptr2.next != ptr1) 
    {
        ptr2 = ptr2.next;
    }
  
    /* Set the next node of the loop ending node
     to fix the loop */
    ptr2.next = null;
}
  
// Function to print the linked list
function printList(node)
{
    while (node != null) 
    {
        document.write(node.data + " ");
        node = node.next;
    }
}
  
// Driver code
head = new Node(50);
head.next = new Node(20);
head.next.next = new Node(15);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node(10);
  
// Creating a loop for testing
head.next.next.next.next.next = head.next.next;
detectAndRemoveLoop(head);
document.write("Linked List after removing loop : ");
printList(head);
  
// This code is contributed by todaysgaurav 
  
</script>

C++

// C++ program to detect and remove loop
#include <bits/stdc++.h>
using namespace std;
  
struct Node {
    int key;
    struct Node* next;
};
  
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    temp->next = NULL;
    return temp;
}
  
// A utility function to print a linked list
void printList(Node* head)
{
    while (head != NULL) {
        cout << head->key << " ";
        head = head->next;
    }
    cout << endl;
}
  
// Function to detect and remove loop in a linked list that
// may contain loop
void detectAndRemoveLoop(Node* head)
{
    // If list is empty or has only one node without loop
    if (head == NULL || head->next == NULL)
        return;
  
    Node *slow = head, *fast = head;
  
    // Move slow and fast 1 and 2 steps ahead respectively.
    slow = slow->next;
    fast = fast->next->next;
  
    // Search for loop using slow and fast pointers
    while (fast && fast->next) {
        if (slow == fast)
            break;
        slow = slow->next;
        fast = fast->next->next;
    }
  
    /* If loop exists */
    if (slow == fast) {
        slow = head;
  
        // this check is needed when slow and fast both meet
        // at the head of the LL eg: 1->2->3->4->5 and then
        // 5->next = 1 i.e the head of the LL
        if (slow == fast)
            while (fast->next != slow)
                fast = fast->next;
        else {
            while (slow->next != fast->next) {
                slow = slow->next;
                fast = fast->next;
            }
        }
  
        /* since fast->next is the looping point */
        fast->next = NULL; /* remove loop */
    }
}
  
/* Driver program to test above function*/
int main()
{
    Node* head = newNode(50);
    head->next = head;
    head->next = newNode(20);
    head->next->next = newNode(15);
    head->next->next->next = newNode(4);
    head->next->next->next->next = newNode(10);
  
    /* Create a loop for testing */
    head->next->next->next->next->next = head;
  
    detectAndRemoveLoop(head);
  
    printf("Linked List after removing loop \n");
    printList(head);
  
    return 0;
}
  
// This code is contributed by Aditya Kumar (adityakumar129)

C

// C++ program to detect and remove loop
#include <stdio.h>
#include <stdlib.h>
  
typedef struct Node {
    int key;
    struct Node* next;
} Node;
  
Node* newNode(int key)
{
    Node* temp = (Node*)malloc(sizeof(Node));
    temp->key = key;
    temp->next = NULL;
    return temp;
}
  
// A utility function to print a linked list
void printList(Node* head)
{
    while (head != NULL) {
        printf("%d  ", head->key);
        head = head->next;
    }
    printf("\n");
}
  
// Function to detect and remove loop in a linked list that
// may contain loop
void detectAndRemoveLoop(Node* head)
{
    // If list is empty or has only one node without loop
    if (head == NULL || head->next == NULL)
        return;
  
    Node *slow = head, *fast = head;
  
    // Move slow and fast 1 and 2 steps ahead respectively.
    slow = slow->next;
    fast = fast->next->next;
  
    // Search for loop using slow and fast pointers
    while (fast && fast->next) {
        if (slow == fast)
            break;
        slow = slow->next;
        fast = fast->next->next;
    }
  
    /* If loop exists */
    if (slow == fast) {
        slow = head;
  
        // this check is needed when slow and fast both meet
        // at the head of the LL eg: 1->2->3->4->5 and then
        // 5->next = 1 i.e the head of the LL
        if (slow == fast)
            while (fast->next != slow)
                fast = fast->next;
        else {
            while (slow->next != fast->next) {
                slow = slow->next;
                fast = fast->next;
            }
        }
  
        /* since fast->next is the looping point */
        fast->next = NULL; /* remove loop */
    }
}
  
/* Driver program to test above function*/
int main()
{
    Node* head = newNode(50);
    head->next = head;
    head->next = newNode(20);
    head->next->next = newNode(15);
    head->next->next->next = newNode(4);
    head->next->next->next->next = newNode(10);
  
    /* Create a loop for testing */
    head->next->next->next->next->next = head;
  
    detectAndRemoveLoop(head);
  
    printf("Linked List after removing loop \n");
    printList(head);
  
    return 0;
}
  
// This code is contributed by Aditya Kumar (adityakumar129)

Java

// Java program to detect 
// and remove loop in linked list
  
class LinkedList {
  
    static Node head;
  
    static class Node {
  
        int data;
        Node next;
  
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    // Function that detects loop in the list
    void detectAndRemoveLoop(Node node)
    {
  
        // If list is empty or has only one node
        // without loop
        if (node == null || node.next == null)
            return;
  
        Node slow = node, fast = node;
  
        // Move slow and fast 1 and 2 steps
        // ahead respectively.
        slow = slow.next;
        fast = fast.next.next;
  
        // Search for loop using slow and fast pointers
        while (fast != null && fast.next != null) {
            if (slow == fast)
                break;
  
            slow = slow.next;
            fast = fast.next.next;
        }
  
         /* If loop exists */
        if (slow == fast) {
            slow = node;
            if (slow != fast) {
                while (slow.next != fast.next) {
                    slow = slow.next;
                    fast = fast.next;
                }
                /* since fast->next is the looping point */
                fast.next = null; /* remove loop */
            }
              /* This case is added if fast and slow pointer meet at first position. */
            else {
                while(fast.next != slow) {
                    fast = fast.next;
                }
                fast.next = null;
            }
        }
    }
  
    // Function to print the linked list
    void printList(Node node)
    {
        while (node != null) {
            System.out.print(node.data + " ");
            node = node.next;
        }
    }
  
    // Driver code
    public static void main(String[] args)
    {
        LinkedList list = new LinkedList();
        list.head = new Node(50);
        list.head.next = new Node(20);
        list.head.next.next = new Node(15);
        list.head.next.next.next = new Node(4);
        list.head.next.next.next.next = new Node(10);
  
        // Creating a loop for testing
        head.next.next.next.next.next = head.next.next;
        list.detectAndRemoveLoop(head);
        System.out.println("Linked List after removing loop : ");
        list.printList(head);
    }
}
  
// This code has been contributed by Mayank Jaiswal

Python3

# Python program to detect and remove loop
  
# Node class
  
  
class Node:
  
    # Constructor to initialize the node object
    def __init__(self, data):
        self.data = data
        self.next = None
  
  
class LinkedList:
  
    # Function to initialize head
    def __init__(self):
        self.head = None
  
    # Function to insert a new node at the beginning
    def push(self, new_data):
        new_node = Node(new_data)
        new_node.next = self.head
        self.head = new_node
  
    def detectAndRemoveLoop(self):  
      if self.head is None:
          return
      if self.head.next is None:
          return
      slow_p = self.head
      fast_p = self.head
           
      while(slow_p and fast_p and fast_p.next):
          slow_p = slow_p.next
          fast_p = fast_p.next.next
  
          # If slow_p and fast_p meet at some point then
          # there is a loop
          if slow_p == fast_p:
            slow_p = self.head
              # Finding the beginning of the loop
            while (slow_p.next != fast_p.next):
              slow_p = slow_p.next
              fast_p = fast_p.next
  
                # Sinc fast.next is the looping point
            fast_p.next = None  # Remove loop
  
    # Utility function to print the LinkedList
  
    def printList(self):
        temp = self.head
        while(temp):
            print(temp.data, end = ' ')
            temp = temp.next
  
  
# Driver program
llist = LinkedList()
llist.head = Node(50)
llist.head.next = Node(20)
llist.head.next.next = Node(15)
llist.head.next.next.next = Node(4)
llist.head.next.next.next.next = Node(10)
  
# Create a loop for testing
llist.head.next.next.next.next.next = llist.head.next.next
  
llist.detectAndRemoveLoop()
  
print("Linked List after removing loop")
llist.printList()
  
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)

C#

// C# program to detect and remove loop in linked list
using System;
  
public class LinkedList {
  
    public Node head;
  
    public class Node {
  
        public int data;
        public Node next;
  
        public Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    // Function that detects loop in the list
    void detectAndRemoveLoop(Node node)
    {
  
        // If list is empty or has only one node
        // without loop
        if (node == null || node.next == null)
            return;
  
        Node slow = node, fast = node;
  
        // Move slow and fast 1 and 2 steps
        // ahead respectively.
        slow = slow.next;
        fast = fast.next.next;
  
        // Search for loop using slow and fast pointers
        while (fast != null && fast.next != null) {
            if (slow == fast)
                break;
  
            slow = slow.next;
            fast = fast.next.next;
        }
  
        /* If loop exists */
        if (slow == fast) {
            slow = node;
            while (slow.next != fast.next) {
                slow = slow.next;
                fast = fast.next;
            }
  
            /* since fast->next is the looping point */
            fast.next = null; /* remove loop */
        }
    }
  
    // Function to print the linked list
    void printList(Node node)
    {
        while (node != null) {
            Console.Write(node.data + " ");
            node = node.next;
        }
    }
  
    // Driver program to test above functions
    public static void Main(String[] args)
    {
        LinkedList list = new LinkedList();
        list.head = new Node(50);
        list.head.next = new Node(20);
        list.head.next.next = new Node(15);
        list.head.next.next.next = new Node(4);
        list.head.next.next.next.next = new Node(10);
  
        // Creating a loop for testing
        list.head.next.next.next.next.next = list.head.next.next;
        list.detectAndRemoveLoop(list.head);
        Console.WriteLine("Linked List after removing loop : ");
        list.printList(list.head);
    }
}
  
// This code contributed by Rajput-Ji

Javascript

<script>
// javascript program to detect 
// and remove loop in linked list
var head;
  
     class Node 
     {
            constructor(val)
            {
                this.data = val;
                this.next = null;
            }
        }
  
    // Function that detects loop in the list
    function detectAndRemoveLoop(node) {
  
        // If list is empty or has only one node
        // without loop
        if (node == null || node.next == null)
            return;
  
        var slow = node, fast = node;
  
        // Move slow and fast 1 and 2 steps
        // ahead respectively.
        slow = slow.next;
        fast = fast.next.next;
  
        // Search for loop using slow and fast pointers
        while (fast != null && fast.next != null) {
            if (slow == fast)
                break;
  
            slow = slow.next;
            fast = fast.next.next;
        }
  
        /* If loop exists */
        if (slow == fast) {
            slow = node;
            if (slow != fast) {
                while (slow.next != fast.next) {
                    slow = slow.next;
                    fast = fast.next;
                }
                  
                /* since fast->next is the looping point */
                fast.next = null; /* remove loop */
            }
              
            /* This case is added if fast and 
            slow pointer meet at first position. */
            else {
                while (fast.next != slow) {
                    fast = fast.next;
                }
                fast.next = null;
            }
        }
    }
  
    // Function to print the linked list
    function printList(node) {
        while (node != null) {
            document.write(node.data + " ");
            node = node.next;
        }
    }
  
    // Driver code
        head = new Node(50);
        head.next = new Node(20);
        head.next.next = new Node(15);
        head.next.next.next = new Node(4);
        head.next.next.next.next = new Node(10);
  
        // Creating a loop for testing
        head.next.next.next.next.next = head.next.next;
        detectAndRemoveLoop(head);
        document.write("Linked List after removing loop : ");
        printList(head);
  
// This code is contributed by umadevi9616 
</script>

C++

// C++ program to detect and remove loop
#include <bits/stdc++.h>
using namespace std;
  
struct Node {
    int key;
    struct Node* next;
};
  
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    temp->next = NULL;
    return temp;
}
  
// A utility function to print a linked list
void printList(Node* head)
{
    while (head != NULL) {
        cout << head->key << " ";
        head = head->next;
    }
    cout << endl;
}
  
// Function to detect and remove loop
// in a linked list that may contain loop
void hashAndRemove(Node* head)
{
    // hash map to hash addresses of the linked list nodes
    unordered_map<Node*, int> node_map;
    // pointer to last node
    Node* last = NULL;
    while (head != NULL) {
        // if node not present in the map, insert it in the map
        if (node_map.find(head) == node_map.end()) {
            node_map[head]++;
            last = head;
            head = head->next;
        }
        // if present, it is a cycle, make the last node's next pointer NULL
        else {
            last->next = NULL;
            break;
        }
    }
}
/* Driver program to test above function*/
int main()
{
    Node* head = newNode(50);
    head->next = head;
    head->next = newNode(20);
    head->next->next = newNode(15);
    head->next->next->next = newNode(4);
    head->next->next->next->next = newNode(10);
  
    /* Create a loop for testing */
    head->next->next->next->next->next = head->next->next;
  
    // printList(head);
    hashAndRemove(head);
  
    printf("Linked List after removing loop \n");
    printList(head);
  
    return 0;
}

Java

// Java program to detect  and remove loop in a linked list
import java.util.*;
  
public class LinkedList {
  
    static Node head; // head of list
  
    /* Linked list Node*/
    static class Node {
        int data;
        Node next;
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    /* Inserts a new Node at front of the list. */
    static public void push(int new_data)
    {
        /* 1 & 2: Allocate the Node & 
                Put in the data*/
        Node new_node = new Node(new_data);
  
        /* 3. Make next of new Node as head */
        new_node.next = head;
  
        /* 4. Move the head to point to new Node */
        head = new_node;
    }
  
    // Function to print the linked list
    void printList(Node node)
    {
        while (node != null) {
            System.out.print(node.data + " ");
            node = node.next;
        }
    }
  
    // Returns true if the loop is removed from the linked
    // list else returns false.
    static boolean removeLoop(Node h)
    {
        HashSet<Node> s = new HashSet<Node>();
        Node prev = null;
        while (h != null) {
            // If we have already has this node
            // in hashmap it means their is a cycle and we
            // need to remove this cycle so set the next of
            // the previous pointer with null.
  
            if (s.contains(h)) {
                prev.next = null;
                return true;
            }
  
            // If we are seeing the node for
            // the first time, insert it in hash
            else {
                s.add(h);
                prev = h;
                h = h.next;
            }
        }
  
        return false;
    }
  
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        LinkedList llist = new LinkedList();
  
        llist.push(20);
        llist.push(4);
        llist.push(15);
        llist.push(10);
  
        /*Create loop for testing */
        llist.head.next.next.next.next = llist.head;
  
        if (removeLoop(head)) {
            System.out.println("Linked List after removing loop");
            llist.printList(head);
        }
        else
            System.out.println("No Loop found");
    }
}
  
// This code is contributed by Animesh Nag.

C#

// C# program to detect  and remove loop in a linked list
  
using System;
using System.Collections.Generic;
public class LinkedList {
  
    public Node head; // head of list
  
    /* Linked list Node*/
    public class Node {
        public int data;
        public Node next;
        public Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
   
  
    // Function to print the linked list
    void printList(Node node)
    {
        while (node != null) {
            Console.Write(node.data + " ");
            node = node.next;
        }
    }
  
    // Returns true if the loop is removed from the linked
    // list else returns false.
    bool removeLoop(Node h)
    {
        HashSet<Node> s = new HashSet<Node>();
        Node prev = null;
        while (h != null) {
            // If we have already has this node
            // in hashmap it means their is a cycle and we
            // need to remove this cycle so set the next of
            // the previous pointer with null.
  
            if (s.Contains(h)) {
                prev.next = null;
                return true;
            }
  
            // If we are seeing the node for
            // the first time, insert it in hash
            else {
                s.Add(h);
                prev = h;
                h = h.next;
            }
        }
  
        return false;
    }
  
    /* Driver program to test above function */
    public static void Main()
    {
         
        LinkedList list = new LinkedList();
        list.head = new Node(50);
        list.head.next = new Node(20);
        list.head.next.next = new Node(15);
        list.head.next.next.next = new Node(4);
        list.head.next.next.next.next = new Node(10);
  
        /*Create loop for testing */
        list.head.next.next.next.next.next = list.head.next.next;
  
        if (list.removeLoop(list.head)) {
            Console.WriteLine("Linked List after removing loop");
            list.printList(list.head);
        }
        else
            Console.WriteLine("No Loop found");
    }
}
  
// This code is contributed by ihritik

Javascript

<script>
// javascript program to detect  and remove loop in a linked list class LinkedList {
  
    /* Linked list Node */
     class Node {
            constructor(val) {
                this.data = val;
                this.next = null;
            }
        }
     var head; // head of list
  
    /* Inserts a new Node at front of the list. */
      function push(new_data) {
        /*
         * 1 & 2: Allocate the Node & Put in the data
         */
var new_node = new Node(new_data);
  
        /* 3. Make next of new Node as head */
        new_node.next = head;
  
        /* 4. Move the head to point to new Node */
        head = new_node;
        return head;
    }
  
    // Function to print the linked list
    function printList(node) {
        while (node != null) {
            document.write(node.data + " ");
            node = node.next;
        }
    }
  
    // Returns true if the loop is removed from the linked
    // list else returns false.
    function removeLoop(h) 
    {
      
        var s = new Set();
        var prev = null;
        while (h != null) 
        {
          
            // If we have already has this node
            // in hashmap it means their is a cycle and we
            // need to remove this cycle so set the next of
            // the previous pointer with null.
  
            if (s.has(h)) {
                prev.next = null;
                return true;
            }
  
            // If we are seeing the node for
            // the first time, insert it in hash
            else {
                s.add(h);
                prev = h;
                h = h.next;
            }
        }
  
        return false;
    }
  
    /* Driver program to test above function */
        head = push(50);
        head.next = push(20);
        head.next.next=push(4);
        head.next.next.next=push(15);
        head.next.next.next.next=push(10);
  
        /* Create loop for testing */
        head.next.next.next.next.next = head.next.next;
  
        if (removeLoop(head)) {
            document.write("Linked List after removing loop<br/>");
            printList(head);
        } else
            document.write("No Loop found");
  
// This code is contributed by gauravrajput1
</script>

Python

class LinkedList:
    head = None
    # head of list
    # Linked list Node
  
    class Node:
        data = 0
        next = None
  
        def __init__(self, d):
            self.data = d
            self.next = None
    # Inserts a new Node at front of the list.
  
    @staticmethod
    def push(new_data):
        # 1 & 2: Allocate the Node &
        #                Put in the data
        new_node = LinkedList.Node(new_data)
        # 3. Make next of new Node as head
        new_node.next = LinkedList.head
        # 4. Move the head to point to new Node
        LinkedList.head = new_node
    # Function to print the linked list
  
    def printList(self, node):
        while (node != None):
            print(node.data)
            node = node.next
    # Returns true if the loop is removed from the linked
    # list else returns false.
  
    @staticmethod
    def removeLoop(h):
        s = set()
        prev = None
        while (h != None):
            # If we have already has this node
            # in hashmap it means their is a cycle and we
            # need to remove this cycle so set the next of
            # the previous pointer with null.
            if (h in s):
                prev.next = None
                return True
            else:
                s.add(h)
                prev = h
                h = h.next
        return False
    # Driver program to test above function
  
    @staticmethod
    def main(args):
        llist = LinkedList()
        llist.push(20)
        llist.push(4)
        llist.push(15)
        llist.push(10)
        # Create loop for testing
        llist.head.next.next.next.next = llist.head
        if (LinkedList.removeLoop(LinkedList.head)):
            print("Linked List after removing loop")
            llist.printList(LinkedList.head)
        else:
            print("No Loop found")
  
  
if __name__ == "__main__":
    LinkedList.main([])
  
# This code is contributed by mukulsomukesh

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *