![]()
Given such a structure the output should be
10->5->12->7->11->4->20->13->17->6->2->16->9->8->3->19->15.
Given a linked list where in addition to the next pointer, each node has a child pointer, which may or may not point to a separate list. These child lists may have one or more children of their own, and so on, to produce a multilevel data structure, as shown in below figure.You are given the head of the first level of the list. Flatten the list so that all the nodes appear in a single-level linked list. You need to flatten the list in way that all nodes at first level should come first, then nodes of second level, and so on.
This question is attributed to GeekForGeeks. Looking for code-review, optimizations and best practices. Verifying complexity to be \$O(n)\$, where \$n\$ is the count of all the nodes in the input multilevel linked list.
class Nodes<T> {
Nodes<T> right;
T item;
Nodes<T> down;
Nodes(T item) {
this.item = item;
}
}
public final class FlattenMultiLevelList<T> {
public static <T> List<T> flatten (Nodes<T> node) {
final List<T> flattenedList = new ArrayList<>();
final Queue<Nodes<T>> nodeHead = new LinkedList<>();
nodeHead.add(node);
// travese the all heads
while (!nodeHead.isEmpty()) {
Nodes<T> currNode = nodeHead.poll();
// traverse all Linkedlists
while (currNode != null) {
if (currNode.down != null) { nodeHead.add(currNode.down); }
flattenedList.add(currNode.item);
currNode = currNode.right;
}
}
return flattenedList;
}
}
public class FlattenMultiLevelListTest {
@Test
public void test() {
// level 1 should contain only a single linkedlist.
Nodes<Integer> node1_1_1 = new Nodes<>(10);
Nodes<Integer> node1_1_2 = new Nodes<>(5);
Nodes<Integer> node1_1_3 = new Nodes<>(12);
Nodes<Integer> node14 = new Nodes<>(7);
Nodes<Integer> node15 = new Nodes<>(11);
node1_1_1.right = node1_1_2;
node1_1_2.right = node1_1_3;
node1_1_3.right = node14;
node14.right = node15;
// level 2, first linkedlist, first node
Nodes<Integer> node2_1_1 = new Nodes<>(4);
Nodes<Integer> node2_1_2 = new Nodes<>(20);
Nodes<Integer> node2_1_3 = new Nodes<>(13);
node2_1_1.right = node2_1_2;
node2_1_2.right = node2_1_3;
node1_1_1.down = node2_1_1;
// level 2, second linkedlist, first node.
Nodes<Integer> node2_2_1 = new Nodes<>(17);
Nodes<Integer> node2_2_2 = new Nodes<>(6);
node2_2_1.right = node2_2_2;
node1_1_3.down = node2_2_1;
Nodes<Integer> node3_1_1 = new Nodes<>(2);
node2_1_2.down = node3_1_1;
Nodes<Integer> node3_2_1 = new Nodes<>(16);
node2_1_3.down = node3_2_1;
Nodes<Integer> node3_3_1 = new Nodes<>(9);
Nodes<Integer> node3_3_2 = new Nodes<>(8);
node3_3_1.right = node3_3_2;
node2_2_1.down = node3_3_1;
Nodes<Integer> node4_1_1 = new Nodes<>(3);
node3_2_1.down = node4_1_1;
Nodes<Integer> node4_2_1 = new Nodes<>(19);
Nodes<Integer> node4_2_2 = new Nodes<>(15);
node4_2_1.right = node4_2_2;
node3_3_1.down = node4_2_1;
assertEquals(Arrays.asList(10,5,12,7,11,4,20,13,17,6,2,16,9,8,3,19,15), FlattenMultiLevelList.flatten(node1_1_1));
}
}