Clone linked list with random pointer (#180)

pull/191/head
Aayush Jain 2021-04-14 18:10:52 +05:30 committed by GitHub
parent 756589e272
commit b2cf773646
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 133 additions and 6 deletions

View File

@ -4,22 +4,24 @@
1. [Singly Linked List](c-or-cpp/singly.cpp) 1. [Singly Linked List](c-or-cpp/singly.cpp)
2. [Reversing Linked List](c-or-cpp/reverse.cpp) 2. [Reversing Linked List](c-or-cpp/reverse.cpp)
2. [Doubly Linked List](c-or-cpp/doubly.cpp) 3. [Doubly Linked List](c-or-cpp/doubly.cpp)
3. [Circular Linked List](c-or-cpp/circular.cpp) 4. [Circular Linked List](c-or-cpp/circular.cpp)
4. [Insertion Linked List](c-or-cpp/all-possible-insertion.cpp) 5. [Insertion Linked List](c-or-cpp/all-possible-insertion.cpp)
5. [Josephus Problem Using Circular Linked List](c-or-cpp/josephus-problem.c) 6. [Josephus Problem Using Circular Linked List](c-or-cpp/josephus-problem.c)
### Java ### Java
1. [Singly Linked List](java/singly.java) 1. [Singly Linked List](java/singly.java)
2. [Doubly Linked List](java/doubly.java) 2. [Doubly Linked List](java/doubly.java)
2. [Circular Linked List](java/circular.java) 3. [Circular Linked List](java/circular.java)
2. [Reverse Linked List](java/reverse.java) 4. [Reverse Linked List](java/reverse.java)
5. [Clone Linked List with Random Pointer](java/clone-linkedlist-with-rnd-pointer.java)
### JavaScript ### JavaScript
1. [Singly Linked List](js/singly.js) 1. [Singly Linked List](js/singly.js)
### Python ### Python
1. [Singly Linked List](Python/singly.py) 1. [Singly Linked List](Python/singly.py)
2. [Doubly Linked List](Python/doubly.py) 2. [Doubly Linked List](Python/doubly.py)

View File

@ -0,0 +1,125 @@
// Java program to clone a linked list with random pointers
import java.util.HashMap;
import java.util.Map;
// Linked List Node class
class Node
{
int data;//Node data
Node next, random;//Next and random reference
//Node constructor
public Node(int data)
{
this.data = data;
this.next = this.random = null;
}
}
// linked list class
class LinkedList
{
Node head;//Linked list head reference
// Linked list constructor
public LinkedList(Node head)
{
this.head = head;
}
// push method to put data always at the head
// in the linked list.
public void push(int data)
{
Node node = new Node(data);
node.next = this.head;
this.head = node;
}
// Method to print the list.
void print()
{
Node temp = head;
while (temp != null)
{
Node random = temp.random;
int randomData = (random != null)? random.data: -1;
System.out.println("Data = " + temp.data +
", Random data = "+ randomData);
temp = temp.next;
}
}
// Actual clone method which returns head
// reference of cloned linked list.
public LinkedList clone()
{
// Initialize two references, one with original
// list's head.
Node origCurr = this.head, cloneCurr = null;
// Hash map which contains node to node mapping of
// original and clone linked list.
Map<Node, Node> map = new HashMap<Node, Node>();
// Traverse the original list and make a copy of that
// in the clone linked list.
while (origCurr != null)
{
cloneCurr = new Node(origCurr.data);
map.put(origCurr, cloneCurr);
origCurr = origCurr.next;
}
// Adjusting the original list reference again.
origCurr = this.head;
// Traversal of original list again to adjust the next
// and random references of clone list using hash map.
while (origCurr != null)
{
cloneCurr = map.get(origCurr);
cloneCurr.next = map.get(origCurr.next);
cloneCurr.random = map.get(origCurr.random);
origCurr = origCurr.next;
}
//return the head reference of the clone list.
return new LinkedList(map.get(this.head));
}
}
// Driver Class
class Main
{
// Main method.
public static void main(String[] args)
{
// Pushing data in the linked list.
LinkedList list = new LinkedList(new Node(5));
list.push(4);
list.push(3);
list.push(2);
list.push(1);
// Setting up random references.
list.head.random = list.head.next.next;
list.head.next.random =
list.head.next.next.next;
list.head.next.next.random =
list.head.next.next.next.next;
list.head.next.next.next.random =
list.head.next.next.next.next.next;
list.head.next.next.next.next.random =
list.head.next;
// Making a clone of the original linked list.
LinkedList clone = list.clone();
// Print the original and cloned linked list.
System.out.println("Original linked list");
list.print();
System.out.println("\nCloned linked list");
clone.print();
}
}