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