Skip to content

Commit 0a3d212

Browse files
marcos-lgpedja4
authored andcommitted
BAEL-1773 Find the middle element of a Linked List. (eugenp#4425)
* BAEL-1773 - find middle element of linked list * changes from review * changes from review * find middle element in linked list * typo
1 parent 8080f07 commit 0a3d212

3 files changed

Lines changed: 83 additions & 31 deletions

File tree

core-java/src/main/java/com/baeldung/linkedlist/MiddleElementLookup.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
11
package com.baeldung.linkedlist;
22

3-
import com.baeldung.linkedlist.LinkedList.Node;
3+
import java.util.LinkedList;
4+
5+
import com.baeldung.linkedlist.Node;
46

57
public class MiddleElementLookup {
68

7-
public static String findMiddleElement(Node head) {
9+
public static String findMiddleElementLinkedList(LinkedList<String> linkedList) {
10+
if (linkedList == null || linkedList.isEmpty()) {
11+
return null;
12+
}
13+
14+
return linkedList.get((linkedList.size() - 1) / 2);
15+
}
16+
17+
public static String findMiddleElementFromHead(Node head) {
818
if (head == null) {
919
return null;
1020
}
@@ -26,7 +36,7 @@ public static String findMiddleElement(Node head) {
2636
return current.data();
2737
}
2838

29-
public static String findMiddleElement1PassRecursively(Node head) {
39+
public static String findMiddleElementFromHead1PassRecursively(Node head) {
3040
if (head == null) {
3141
return null;
3242
}
@@ -53,7 +63,7 @@ private static void findMiddleRecursively(Node node, MiddleAuxRecursion middleAu
5363
middleAux.length--;
5464
}
5565

56-
public static String findMiddleElement1PassIteratively(Node head) {
66+
public static String findMiddleElementFromHead1PassIteratively(Node head) {
5767
if (head == null) {
5868
return null;
5969
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.baeldung.linkedlist;
2+
3+
public class Node {
4+
private Node next;
5+
private String data;
6+
7+
public Node(String data) {
8+
this.data = data;
9+
}
10+
11+
public String data() {
12+
return data;
13+
}
14+
15+
public void setData(String data) {
16+
this.data = data;
17+
}
18+
19+
public boolean hasNext() {
20+
return next != null;
21+
}
22+
23+
public Node next() {
24+
return next;
25+
}
26+
27+
public void setNext(Node next) {
28+
this.next = next;
29+
}
30+
31+
public String toString() {
32+
return this.data;
33+
}
34+
}

core-java/src/test/java/com/baeldung/linkedlist/MiddleElementLookupUnitTest.java

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,46 @@
22

33
import static org.junit.Assert.assertEquals;
44

5+
import java.util.LinkedList;
6+
57
import org.junit.Test;
68

79
public class MiddleElementLookupUnitTest {
810

911
@Test
10-
public void whenFindingMiddle_thenMiddleFound() {
11-
String middle = MiddleElementLookup.findMiddleElement(createList(5).head());
12-
assertEquals("3", middle);
13-
14-
middle = MiddleElementLookup.findMiddleElement(createList(4).head());
15-
assertEquals("2", middle);
12+
public void whenFindingMiddleLinkedList_thenMiddleFound() {
13+
assertEquals("3", MiddleElementLookup.findMiddleElementLinkedList(createLinkedList(5)));
14+
assertEquals("2", MiddleElementLookup.findMiddleElementLinkedList(createLinkedList(4)));
1615
}
1716

1817
@Test
19-
public void whenFindingMiddle1PassRecursively_thenMiddleFound() {
20-
String middle = MiddleElementLookup.findMiddleElement1PassRecursively(createList(5).head());
21-
assertEquals("3", middle);
22-
23-
middle = MiddleElementLookup.findMiddleElement1PassRecursively(createList(4).head());
24-
assertEquals("2", middle);
18+
public void whenFindingMiddleFromHead_thenMiddleFound() {
19+
assertEquals("3", MiddleElementLookup.findMiddleElementFromHead(createNodesList(5)));
20+
assertEquals("2", MiddleElementLookup.findMiddleElementFromHead(createNodesList(4)));
2521
}
2622

2723
@Test
28-
public void whenFindingMiddle1PassIteratively_thenMiddleFound() {
29-
String middle = MiddleElementLookup.findMiddleElement1PassIteratively(createList(5).head());
30-
assertEquals("3", middle);
24+
public void whenFindingMiddleFromHead1PassRecursively_thenMiddleFound() {
25+
assertEquals("3", MiddleElementLookup.findMiddleElementFromHead1PassRecursively(createNodesList(5)));
26+
assertEquals("2", MiddleElementLookup.findMiddleElementFromHead1PassRecursively(createNodesList(4)));
27+
}
3128

32-
middle = MiddleElementLookup.findMiddleElement1PassIteratively(createList(4).head());
33-
assertEquals("2", middle);
29+
@Test
30+
public void whenFindingMiddleFromHead1PassIteratively_thenMiddleFound() {
31+
assertEquals("3", MiddleElementLookup.findMiddleElementFromHead1PassIteratively(createNodesList(5)));
32+
assertEquals("2", MiddleElementLookup.findMiddleElementFromHead1PassIteratively(createNodesList(4)));
3433
}
3534

3635
@Test
3736
public void whenListEmptyOrNull_thenMiddleNull() {
38-
String middle = MiddleElementLookup.findMiddleElement(null);
39-
assertEquals(null, middle);
40-
41-
middle = MiddleElementLookup.findMiddleElement1PassIteratively(null);
42-
assertEquals(null, middle);
43-
44-
middle = MiddleElementLookup.findMiddleElement1PassRecursively(null);
45-
assertEquals(null, middle);
37+
assertEquals(null, MiddleElementLookup.findMiddleElementLinkedList(null));
38+
assertEquals(null, MiddleElementLookup.findMiddleElementFromHead(null));
39+
assertEquals(null, MiddleElementLookup.findMiddleElementFromHead1PassIteratively(null));
40+
assertEquals(null, MiddleElementLookup.findMiddleElementFromHead1PassRecursively(null));
4641
}
4742

48-
private static LinkedList createList(int n) {
49-
LinkedList list = new LinkedList();
43+
private static LinkedList<String> createLinkedList(int n) {
44+
LinkedList<String> list = new LinkedList<>();
5045

5146
for (int i = 1; i <= n; i++) {
5247
list.add(String.valueOf(i));
@@ -55,4 +50,17 @@ private static LinkedList createList(int n) {
5550
return list;
5651
}
5752

53+
private static Node createNodesList(int n) {
54+
Node head = new Node("1");
55+
Node current = head;
56+
57+
for (int i = 2; i <= n; i++) {
58+
Node newNode = new Node(String.valueOf(i));
59+
current.setNext(newNode);
60+
current = newNode;
61+
}
62+
63+
return head;
64+
}
65+
5866
}

0 commit comments

Comments
 (0)