# Correct the Random Pointer in Doubly Linked List

• Difficulty Level : Basic
• Last Updated : 23 Sep, 2020

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:

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.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students. 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``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<data<<``"->"``;``            ``temp=temp->next;``        ``}``        ``cout<next!=NULL)``        ``{``            ``temp=temp->next;``        ``}``        ``while``(temp!=NULL)``        ``{``            ``cout<data<<``" ->"``;``            ``temp=temp->prev;``        ``}``        ``cout<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)

```

My Personal Notes arrow_drop_up