1+ package com .thealgorithms .datastructures .lists ;
2+
3+ import static org .junit .jupiter .api .Assertions .assertEquals ;
4+ import static org .junit .jupiter .api .Assertions .assertNull ;
5+
6+ import java .util .ArrayList ;
7+ import java .util .List ;
8+ import org .junit .jupiter .api .DisplayName ;
9+ import org .junit .jupiter .api .Test ;
10+
11+ /**
12+ * Unit tests for the FlattenMultilevelLinkedList class.
13+ * This class tests the flattening logic with various list structures,
14+ * including null lists, simple lists, and complex multilevel lists.
15+ */
16+ final class FlattenMultilevelLinkedListTest {
17+
18+ // A helper function to convert a flattened list (connected by child pointers)
19+ // into a standard Java List for easy comparison.
20+ private List <Integer > toList (FlattenMultilevelLinkedList .Node head ) {
21+ List <Integer > list = new ArrayList <>();
22+ FlattenMultilevelLinkedList .Node current = head ;
23+ while (current != null ) {
24+ list .add (current .data );
25+ current = current .child ;
26+ }
27+ return list ;
28+ }
29+
30+ @ Test
31+ @ DisplayName ("Test with a null list" )
32+ void testFlattenNullList () {
33+ assertNull (FlattenMultilevelLinkedList .flatten (null ));
34+ }
35+
36+ @ Test
37+ @ DisplayName ("Test with a simple, single-level list" )
38+ void testFlattenSingleLevelList () {
39+ // Create a simple list: 1 -> 2 -> 3
40+ FlattenMultilevelLinkedList .Node head = new FlattenMultilevelLinkedList .Node (1 );
41+ head .next = new FlattenMultilevelLinkedList .Node (2 );
42+ head .next .next = new FlattenMultilevelLinkedList .Node (3 );
43+
44+ // Flatten the list
45+ FlattenMultilevelLinkedList .Node flattenedHead = FlattenMultilevelLinkedList .flatten (head );
46+
47+ // Expected output: 1 -> 2 -> 3 (vertically)
48+ List <Integer > expected = List .of (1 , 2 , 3 );
49+ assertEquals (expected , toList (flattenedHead ));
50+ }
51+
52+ @ Test
53+ @ DisplayName ("Test with a complex multilevel list" )
54+ void testFlattenComplexMultilevelList () {
55+ // Create the multilevel structure from the problem description
56+ // 5 -> 10 -> 19 -> 28
57+ // | | | |
58+ // 7 20 22 35
59+ // | | |
60+ // 8 50 40
61+ // | |
62+ // 30 45
63+ FlattenMultilevelLinkedList .Node head = new FlattenMultilevelLinkedList .Node (5 );
64+ head .child = new FlattenMultilevelLinkedList .Node (7 );
65+ head .child .child = new FlattenMultilevelLinkedList .Node (8 );
66+ head .child .child .child = new FlattenMultilevelLinkedList .Node (30 );
67+
68+ head .next = new FlattenMultilevelLinkedList .Node (10 );
69+ head .next .child = new FlattenMultilevelLinkedList .Node (20 );
70+
71+ head .next .next = new FlattenMultilevelLinkedList .Node (19 );
72+ head .next .next .child = new FlattenMultilevelLinkedList .Node (22 );
73+ head .next .next .child .child = new FlattenMultilevelLinkedList .Node (50 );
74+
75+ head .next .next .next = new FlattenMultilevelLinkedList .Node (28 );
76+ head .next .next .next .child = new FlattenMultilevelLinkedList .Node (35 );
77+ head .next .next .next .child .child = new FlattenMultilevelLinkedList .Node (40 );
78+ head .next .next .next .child .child .child = new FlattenMultilevelLinkedList .Node (45 );
79+
80+ // Flatten the list
81+ FlattenMultilevelLinkedList .Node flattenedHead = FlattenMultilevelLinkedList .flatten (head );
82+
83+ // Expected sorted output
84+ List <Integer > expected = List .of (5 , 7 , 8 , 10 , 19 , 20 , 22 , 28 , 30 , 35 , 40 , 45 , 50 );
85+ assertEquals (expected , toList (flattenedHead ));
86+ }
87+
88+ @ Test
89+ @ DisplayName ("Test with some empty child lists" )
90+ void testFlattenWithEmptyChildLists () {
91+ // Create a list: 5 -> 10 -> 12
92+ // | |
93+ // 7 11
94+ // |
95+ // 9
96+ FlattenMultilevelLinkedList .Node head = new FlattenMultilevelLinkedList .Node (5 );
97+ head .child = new FlattenMultilevelLinkedList .Node (7 );
98+ head .child .child = new FlattenMultilevelLinkedList .Node (9 );
99+
100+ head .next = new FlattenMultilevelLinkedList .Node (10 ); // No child list
101+ head .next .child = null ;
102+
103+ head .next .next = new FlattenMultilevelLinkedList .Node (12 );
104+ head .next .next .child = new FlattenMultilevelLinkedList .Node (16 );
105+
106+ // Flatten the list
107+ FlattenMultilevelLinkedList .Node flattenedHead = FlattenMultilevelLinkedList .flatten (head );
108+
109+ // Expected sorted output
110+ List <Integer > expected = List .of (5 , 7 , 9 , 10 , 12 , 16 );
111+ assertEquals (expected , toList (flattenedHead ));
112+ }
113+ }
0 commit comments