rickygrimes
rickygrimes

Reputation: 2716

Clone elements of linkedlist to a new list

I was asked this question in an interview to clone the elements of linked list A into a new list. This was my approach but I was rejected. I did get it right but I am not sure why the interviewer didn't like my approach. Any tips/advise to what I could have done better? List A has elements [10,12,11,4,5,6] let's assume.

public class CopyLinkedListElements {
    
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.head = new Node(10);
        linkedList.head.next = new Node(12);
        linkedList.head.next.next = new Node(11);
        linkedList.head.next.next.next = new Node(4);
        linkedList.head.next.next.next.next = new Node(5);
        linkedList.head.next.next.next.next.next = new Node(6);
        
        cloneOrgList(linkedList.head);
        
    }

    public static void cloneOrgList(Node head) {
        Node current = head;
        Node newHead = new Node(current.data);
        Node prev = newHead;
        System.out.println(prev.data);
        while(current != null && current.next != null) {
            current = current.next;
            Node newNode = new Node(current.data);
            prev.next = newNode;
            prev = newNode;
            System.out.println(prev.data);
        }
    }
}

Upvotes: 0

Views: 1524

Answers (4)

hfontanez
hfontanez

Reputation: 6168

If the interviewer used the word "clone" and not "copy" he or she might have wanted to know if you know how to properly clone objects in Java. IF that was the case, you needed to create a cloneable class. The basic recipe for this is to implement the Cloneable marker interface and override Object's clone method.

public class MyClass implements Cloneable {
    // Details of MyClass omitted

    // Because Java supports covariant return types, the return type
    // for the overridden clone method is the same as the class (i.e. MyClass)
    // Also, the method needs to be made public instead of protected.
    @Override
    public MyClass clone() {
        try {
            return (MyClass) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError("Something went wrong. This isn't supposed to happen");
        }
    }
}

If he or she just wanted a copy, an approach like the one you showed should've been OK, except for what has been already mentioned: Your function failed to return the copy. So, in essence, the method is useless.

Lastly, since your original post stated "clone the elements of linked list", you could've done call Linked List clone method

LinkedList<SomeClass> original = new LinkedList<>();
...
LinkedList<SomeClass> clone = (LinkedList<SomeClass>) original.clone();

Again, if the interviewer wanted you to copy the contents, you could've done one of the following:

  1. Collections.copy(dest, source)
  2. dest.addAll(source)
  3. List<String> dest = source.stream().collect(Collectors.toList());

Lastly, the third alternative was the interviewer wanted you to get into cloning vs copying objects in Java, in which case you would've demonstrated both. In the future, ask the interviewer to clarify and restate the question in your own words to get confirmation that you understood the question correctly BEFORE you jump into coding. From your code, it is clear you misunderstood the interviewer.

Upvotes: 1

Raushan Kumar
Raushan Kumar

Reputation: 1248

I think He was expecting to use the clone() method.

Please have a look at the official doc.Javadoc

Sample Code:

package com.raushan.testmind;

import java.util.LinkedList;

public class TestMain {
    public static void main(String args[]) {

        // Creating an empty LinkedList
        LinkedList<Integer> list = new LinkedList<Integer>();

        // Use add() method to add elements in the list
        list.add(10);
        list.add(12);
        list.add(11);
        list.add(4);
        list.add(5);
        list.add(6);

        // Displaying the list
        System.out.println("First LinkedList:" + list);

        // Creating another linked list and copying
        LinkedList sec_list = new LinkedList();
        sec_list = (LinkedList) list.clone();

        // Displaying the other linked list
        System.out.println("Second LinkedList is:" + sec_list);
    }
}

Upvotes: 0

bliss
bliss

Reputation: 336

In addition to what was mentioned about return values, the loop is a bit messy. It can be improved like this:

public static Node cloneLinkedList(Node head) {
    Node oldCurrent = head;
    Node newHead = new Node(oldCurrent.data);
    Node newCurrent = newHead;
    while ((oldCurrent = oldCurrent.next) != null) {
        newCurrent.next = new Node(oldCurrent.data);
        newCurrent = newCurrent.next;
    }
    return newHead;
}

Upvotes: 1

geco17
geco17

Reputation: 5294

You need to clone the list such that new references and values are returned. This is not happening in the cloneOrgList method. It doesn't return anything and the scope of the node it operates on is limited to the method itself.

You need to do something like

public LinkedList cloneOrgList(LinkedList orig) {
    Node origCurr = orig.head;
    LinkedList copy = new LinkedList();
    Node newCurr = new Node(origCurr.data);
    copy.head = newCurr;
    while (origCurr.next != null) {
        origCurr = origCurr.next;
        newCurr.next = new Node(origCurr.data);
        newCurr = newCurr.next;
    }
    return copy;
}

Upvotes: 0

Related Questions