Skip to content
Related Articles

Related Articles

Correct the Random Pointer in Doubly Linked List
  • Difficulty Level : Basic
  • Last Updated : 23 Sep, 2020
GeeksforGeeks - Summer Carnival Banner

Given a doubly linked list having exactly one of the node pointing to a random node in the list, the task is to correct this random pointer in the doubly linked list, such that it points to the expected node.
Examples: 
 

Input: 

Output: 



Explanation: 2’s next pointer has been corrected to point to 3. Earlier it was pointing to 1, which was incorrect. 
 

Approach: This can be achieved by simply iterating the list and checking the individual pointers.
Below is the implementation for the above approach:
 

C++




// C++ program to Correct
// the Random Pointer in Doubly Linked List
#include<iostream>
using namespace std;
 
// Node of a doubly linked list
class Node
{
    public:
    int data;
    // Pointer to next node in DLL
    Node *next;
       
      // Pointer to previous node in DLL
    Node *prev;
 
    Node():prev(NULL),next(NULL){}
    Node(int data):data(data),prev(NULL),next(NULL){}
 
};
class doublell
{
    public:
    Node *head;
    // Function to append node in the DLL
    void appendNode(Node *n)
    {
        Node *temp=head;
        if(temp==NULL)
        {
            head=n;
             
        }
        else
        {
            while(temp->next!=NULL)
            {
                temp=temp->next;
            }
            temp->next=n;
            n->prev=temp;
        }
    }
      // Function to print the DLL
    void print()
    {
        Node *temp=head;
        while(temp!=NULL)
        {
            cout<<temp->data<<"->";
            temp=temp->next;
        }
        cout<<endl;
    }
      // Function to print reverse of the DLL
    void printReverse()
    {
        Node *temp=head;
        while(temp->next!=NULL)
        {
            temp=temp->next;
        }
        while(temp!=NULL)
        {
            cout<<temp->data<<" ->";
            temp=temp->prev;
        }
        cout<<endl;
    }
    // Function to correct the random pointer
    void correctPointer()
    {
        if(!head)
        {
            return;
        }
        Node *temp=head;
        while(temp->next!=NULL)
        {
            if(temp->next->prev!=temp)
            {
                temp->next->prev=temp;
            }
            temp=temp->next;
        }
    }
};
 
// Driver Code
int main()
{
   
    // Creating a DLL
    doublell ll;
    ll.head = new Node(1);
    ll.head->next = new Node(2);
    ll.head->next->prev = ll.head;
    ll.head->next->next = new Node(3);
    ll.head->next->next->prev =ll.head;
    ll.head->next->next->next = new Node(4);
    ll.head->next->next->next->prev = ll.head->next->next;
   
    cout << "\nIncorrect Linked List: ";
    ll.print();
    ll.printReverse();
   
    ll.correctPointer();
   
    cout << "\nCorrected Linked List: ";
    ll.print();
    ll.printReverse();
 
   
    return 0;
}

Java




// Java program to Correct
// the Random Pointer in Doubly Linked List
class GFG
{
 
// Node of a doubly linked list
static class node
{
    int data;
 
    // Pointer to next node in DLL
    node next;
 
    // Pointer to previous node in DLL
    node prev;
};
 
// Function to allocate node
static node newNode(int data)
{
    node temp = new node();
    temp.data = data;
    temp.next = temp.prev = null;
    return temp;
}
 
// Function to correct the random pointer
static void correctPointer(node head)
{
    if (head == null)
        return;
 
    node temp = head;
 
    // if head->next's previous is not
    // pointing to head itself,
    // change it.
    if (head.next != null &&
        head.next.prev != head)
    {
        head.next.prev = head;
        return;
    }
 
    // If head's previous pointer is incorrect,
    // change it.
    if (head.prev != null)
    {
        head.prev = null;
        return;
    }
 
    // Else check for remaining nodes.
    temp = temp.next;
    while (temp != null)
    {
 
        // If node.next's previous pointer is
        // incorrect, change it.
        if (temp.next != null &&
            temp.next.prev != temp)
        {
            temp.next.prev = temp;
            return;
        }
 
        // Else If node.prev's next pointer is
        // incorrect, change it.
        else if (temp.prev != null &&
                 temp.prev.next != temp)
        {
            temp.prev.next = temp;
            return;
        }
        System.out.print("");
         
        // Else iterate on remaining.
        temp = temp.next;
    }
}
 
// Function to print the DLL
static void printList(node head)
{
    node temp = head;
 
    while (temp != null)
    {
 
        System.out.print(temp.data + " (");
 
        // If prev pointer is null, print -1.
        System.out.print((temp.prev != null ?
                          temp.prev.data: -1) + ") ");
 
        temp = temp.next;
    }
    System.out.print("\n");
}
 
// Driver Code
public static void main(String[] args)
{
    // Creating a DLL
    node head = newNode(1);
    head.next = newNode(2);
    head.next.prev = head;
    head.next.next = newNode(3);
    head.next.next.prev = head;
    head.next.next.next = newNode(4);
    head.next.next.next.prev = head.next.next;
 
    System.out.print("\nIncorrect Linked List: ");
    printList(head);
 
    correctPointer(head);
 
    System.out.print("\nCorrected Linked List: ");
    printList(head);
}
}
 
// This code is contributed by Princi Singh

Python3




# Python3 program to Correct the
# Random Pointer in Doubly Linked List
 
class Node:
     
    def __init__(self, data):
        self.data = data
        self.prev = None
        self.next = None
 
# Function to correct the random pointer
def correctPointer(head):
 
    if head == None:
        return
 
    temp = head
 
    # if head.next's previous is not
    # pointing to head itself, change it.
    if (head.next != None and
        head.next.prev != head):
 
        head.next.prev = head
        return
     
    # If head's previous pointer is
    # incorrect, change it.
    if head.prev != None:
 
        head.prev = None
        return
     
    # Else check for remaining nodes.
    temp = temp.next
    while temp != None:
 
        # If node.next's previous pointer
        # is incorrect, change it.
        if (temp.next != None and
            temp.next.prev != temp):
 
            temp.next.prev = temp
            return
         
        # Else If node.prev's next pointer
        # is incorrect, change it.
        elif (temp.prev != None and
              temp.prev.next != temp):
 
            temp.prev.next = temp
            return
         
        # Else iterate on remaining.
        temp = temp.next
     
# Function to print the DLL
def printList(head):
 
    temp = head
 
    while temp != None:
 
        print(temp.data, "(", end = "")
 
        # If prev pointer is null, print -1.
        if temp.prev == None:
            print(-1, end = ") ")
        else:
            print(temp.prev.data, end = ") ")
         
        temp = temp.next
     
    print()
 
# Driver Code
if __name__ == "__main__":
 
    # Creating a DLL
    head = Node(1)
    head.next = Node(2)
    head.next.prev = head
    head.next.next = Node(3)
    head.next.next.prev = head
    head.next.next.next = Node(4)
    head.next.next.next.prev = head.next.next
 
    print("Incorrect Linked List:",
                         end = " ")
    printList(head)
 
    correctPointer(head)
 
    print("\nCorrected Linked List:",
                           end = " ")
    printList(head)
 
# This code is contributed
# by Rituraj Jain

C#




// C# program to Correct the
// Random Pointer in Doubly Linked List
using System;
class GFG
{
 
// Node of a doubly linked list
class node
{
    public int data;
 
    // Pointer to next node in DLL
    public node next;
 
    // Pointer to next node in DLL
    public node prev;
};
 
// Function to allocate node
static node newNode(int data)
{
    node temp = new node();
    temp.data = data;
    temp.next = temp.prev = null;
    return temp;
}
 
// Function to correct the random pointer
static void correctPointer(node head)
{
    if (head == null)
        return;
 
    node temp = head;
 
    // if head->next's previous is not
    // pointing to head itself,
    // change it.
    if (head.next != null &&
        head.next.prev != head)
    {
        head.next.prev = head;
        return;
    }
 
    // If head's previous pointer is incorrect,
    // change it.
    if (head.prev != null)
    {
        head.prev = null;
        return;
    }
 
    // Else check for remaining nodes.
    temp = temp.next;
    while (temp != null)
    {
 
        // If node.next's previous pointer is
        // incorrect, change it.
        if (temp.next != null &&
            temp.next.prev != temp)
        {
            temp.next.prev = temp;
            return;
        }
 
        // Else If node.prev's next pointer
        // is incorrect, change it.
        else if (temp.prev != null &&
                 temp.prev.next != temp)
        {
            temp.prev.next = temp;
            return;
        }
        Console.Write("");
         
        // Else iterate on remaining.
        temp = temp.next;
    }
}
 
// Function to print the DLL
static void printList(node head)
{
    node temp = head;
 
    while (temp != null)
    {
        Console.Write(temp.data + " (");
 
        // If prev pointer is null, print -1.
        Console.Write((temp.prev != null ?
                       temp.prev.data: -1) + ") ");
 
        temp = temp.next;
    }
    Console.Write("\n");
}
 
// Driver Code
public static void Main(String[] args)
{
    // Creating a DLL
    node head = newNode(1);
    head.next = newNode(2);
    head.next.prev = head;
    head.next.next = newNode(3);
    head.next.next.prev = head;
    head.next.next.next = newNode(4);
    head.next.next.next.prev = head.next.next;
 
    Console.Write("\nIncorrect Linked List: ");
    printList(head);
 
    correctPointer(head);
 
    Console.Write("\nCorrected Linked List: ");
    printList(head);
}
}
 
// This code is contributed by PrinciRaj1992
Output: 
Incorrect Linked List: 1 (-1) 2 (1) 3 (1) 4 (3) 

Corrected Linked List: 1 (-1) 2 (1) 3 (2) 4 (3)


 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up
Recommended Articles
Page :