Skip to content

Add method to get middle node for SinglyLinkedList and unit test for SinglyLinkedList #3913

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,24 @@ public boolean detectLoop() {
return false;
}

/**
* Return the node in the middle of the list
* If the length of the list is even then return item number length/2
* @return middle node of the list
*/
public Node middle() {
if (head == null) {
return null;
}
Node firstCounter = head;
Node secondCounter = firstCounter.next;
while (secondCounter != null && secondCounter.next != null) {
firstCounter = firstCounter.next;
secondCounter = secondCounter.next.next;
}
return firstCounter;
}

/**
* Swaps nodes of two given values a and b.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package com.thealgorithms.datastructures.lists;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

public class SinglyLinkedListTest {

/**
* Initialize a list with natural order values with pre-defined length
* @param length
* @return linked list with pre-defined number of nodes
*/
private SinglyLinkedList createSampleList(int length) {
List<Node> nodeList = new ArrayList<>();
for (int i = 1; i <= length; i++) {
Node node = new Node(i);
nodeList.add(node);
}

for (int i = 0; i < length - 1; i++) {
nodeList.get(i).next = nodeList.get(i+1);
}

return new SinglyLinkedList(nodeList.get(0), length);
}

@Test
void detectLoop() {
//List has cycle
Node firstNode = new Node(1);
Node secondNode = new Node(2);
Node thirdNode = new Node(3);
Node fourthNode = new Node(4);

firstNode.next = secondNode;
secondNode.next = thirdNode;
thirdNode.next = fourthNode;
fourthNode.next = firstNode;

SinglyLinkedList listHasLoop = new SinglyLinkedList(firstNode, 4);
assertTrue(listHasLoop.detectLoop());

SinglyLinkedList listHasNoLoop = createSampleList(5);
assertFalse(listHasNoLoop.detectLoop());
}

@Test
void middle() {
int oddNumberOfNode = 7;
SinglyLinkedList list = createSampleList(oddNumberOfNode);
assertEquals(oddNumberOfNode/2 + 1, list.middle().value);
int evenNumberOfNode = 8;
list = createSampleList(evenNumberOfNode);
assertEquals(evenNumberOfNode/2, list.middle().value);

//return null if empty
list = new SinglyLinkedList();
assertNull(list.middle());

//return head if there is only one node
list = createSampleList(1);
assertEquals(list.getHead(), list.middle());
}

@Test
void swap() {
SinglyLinkedList list = createSampleList(5);
assertEquals(1, list.getHead().value);
assertEquals(5, list.getNth(4));
list.swapNodes(1,5);
assertEquals(5, list.getHead().value);
assertEquals(1, list.getNth(4));
}

@Test
void clear() {
SinglyLinkedList list = createSampleList(5);
assertEquals(5, list.size());
list.clear();
assertEquals(0, list.size());
assertTrue(list.isEmpty());
}

@Test
void search() {
SinglyLinkedList list = createSampleList(10);
assertTrue(list.search(5));
assertFalse(list.search(20));
}

@Test
void deleteNth() {
SinglyLinkedList list = createSampleList(10);
assertTrue(list.search(7));
list.deleteNth(6); //Index 6 has value 7
assertFalse(list.search(7));
}
}