Skip to content

refactor: Enhance docs, add tests in SortedLinkedList #6014

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 6 commits into from
Oct 26, 2024
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 @@ -4,24 +4,42 @@
import java.util.List;

/**
* A SortedLinkedList is a data structure that maintains a sorted list of elements.
* Elements are ordered based on their natural ordering or by a Comparator provided at the time of creation.
* This implementation uses a singly linked list to store the elements.
* Further details can be found on this link
* The SortedLinkedList class represents a singly linked list that maintains its elements in sorted order.
* Elements are ordered based on their natural ordering, with smaller elements at the head and larger elements toward the tail.
* The class provides methods for inserting, deleting, and searching elements, as well as checking if the list is empty.
* <p>
* This implementation utilizes a singly linked list to maintain a dynamically sorted list.
* </p>
* <p>
* Further information can be found here:
* https://runestone.academy/ns/books/published/cppds/LinearLinked/ImplementinganOrderedList.html
* </p>
*
* <b>Usage Example:</b>
* <pre>
* SortedLinkedList list = new SortedLinkedList();
* list.insert(10);
* list.insert(5);
* list.insert(20);
* System.out.println(list); // Outputs: [5, 10, 20]
* </pre>
*/
public class SortedLinkedList {
private Node head;
private Node tail;

/**
* Initializes an empty sorted linked list.
*/
public SortedLinkedList() {
this.head = null;
this.tail = null;
}

/**
* Inserts a new element into the sorted linked list.
* @param value the value to be inserted
* Inserts a new integer into the list, maintaining sorted order.
*
* @param value the integer to insert
*/
public void insert(int value) {
Node newNode = new Node(value);
Expand All @@ -48,16 +66,10 @@ public void insert(int value) {
}

/**
* Displays the elements of the sorted linked list.
*/
public void display() {
System.out.println(this.toString());
}

/**
* Deletes the first occurrence of the specified element in the sorted linked list.
* @param value the value to be deleted
* @return true if the element is found and deleted, false otherwise
* Deletes the first occurrence of a specified integer in the list.
*
* @param value the integer to delete
* @return {@code true} if the element was found and deleted; {@code false} otherwise
*/
public boolean delete(int value) {
if (this.head == null) {
Expand Down Expand Up @@ -87,9 +99,10 @@ public boolean delete(int value) {
}

/**
* Searches for the specified element in the sorted linked list.
* @param value the value to be searched
* @return true if the element is found, false otherwise
* Searches for a specified integer in the list.
*
* @param value the integer to search for
* @return {@code true} if the value is present in the list; {@code false} otherwise
*/
public boolean search(int value) {
Node temp = this.head;
Expand All @@ -103,14 +116,17 @@ public boolean search(int value) {
}

/**
* Checks if the sorted linked list is empty.
* @return true if the list is empty, false otherwise
* Checks if the list is empty.
*
* @return {@code true} if the list is empty; {@code false} otherwise
*/
public boolean isEmpty() {
return head == null;
}

/**
* Returns a string representation of the sorted linked list.
* Returns a string representation of the sorted linked list in the format [element1, element2, ...].
*
* @return a string representation of the sorted linked list
*/
@Override
Expand All @@ -123,12 +139,14 @@ public String toString() {
temp = temp.next;
}
return "[" + String.join(", ", elements) + "]";

} else {
return "[]";
}
}

/**
* Node represents an element in the sorted linked list.
*/
public final class Node {
public final int value;
public Node next;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,62 +4,126 @@
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class SortedLinkedListTest {

private SortedLinkedList list;

@BeforeEach
public void setUp() {
list = new SortedLinkedList();
}

@Test
public void testInsertIntoEmptyList() {
list.insert(5);
assertEquals("[5]", list.toString());
}

@Test
public void testInsert() {
SortedLinkedList list = new SortedLinkedList();
public void testInsertInSortedOrder() {
list.insert(5);
list.insert(3);
list.insert(7);
assertEquals("[3, 5, 7]", list.toString());
}

@Test
public void testDelete() {
SortedLinkedList list = new SortedLinkedList();
public void testInsertDuplicateValues() {
list.insert(5);
list.insert(5);
list.insert(5);
assertEquals("[5, 5, 5]", list.toString());
}

@Test
public void testDeleteHeadElement() {
list.insert(1);
list.insert(2);
list.insert(3);
list.insert(7);
assertTrue(list.delete(5));
assertEquals("[3, 7]", list.toString());
assertFalse(list.delete(10));
assertTrue(list.delete(1));
assertEquals("[2, 3]", list.toString());
}

@Test
public void testSearch() {
SortedLinkedList list = new SortedLinkedList();
list.insert(5);
public void testDeleteTailElement() {
list.insert(1);
list.insert(2);
list.insert(3);
list.insert(7);
assertTrue(list.search(5));
assertFalse(list.search(10));
assertTrue(list.delete(3));
assertEquals("[1, 2]", list.toString());
}

@Test
public void testDeleteMiddleElement() {
list.insert(1);
list.insert(2);
list.insert(3);
assertTrue(list.delete(2));
assertEquals("[1, 3]", list.toString());
}

@Test
public void testDeleteNonexistentElement() {
list.insert(1);
list.insert(2);
assertFalse(list.delete(3));
}

@Test
public void testEmptyList() {
SortedLinkedList list = new SortedLinkedList();
public void testDeleteFromSingleElementList() {
list.insert(5);
assertTrue(list.delete(5));
assertEquals("[]", list.toString());
}

@Test
public void testDeleteFromEmptyList() {
assertFalse(list.delete(5));
}

@Test
public void testSearchInEmptyList() {
assertFalse(list.search(5));
}

@Test
public void testSearchForExistingElement() {
list.insert(3);
list.insert(1);
list.insert(5);
assertTrue(list.search(3));
}

@Test
public void testSearchForNonexistentElement() {
list.insert(3);
list.insert(1);
list.insert(5);
assertFalse(list.search(10));
}

@Test
public void testIsEmptyOnEmptyList() {
SortedLinkedList list = new SortedLinkedList();
assertTrue(list.isEmpty());
}

@Test
public void testIsEmptyOnNonEmptyList() {
SortedLinkedList list = new SortedLinkedList();
list.insert(10);
assertFalse(list.isEmpty());
}

@Test
public void testIsEmptyAfterInsertion() {
list.insert(10);
assertFalse(list.isEmpty());
}

@Test
public void testIsEmptyAfterDeletion() {
SortedLinkedList list = new SortedLinkedList();
list.insert(10);
list.delete(10);
assertTrue(list.isEmpty());
Expand Down