Skip to content

Commit

Permalink
Enhance docs, add tests in SortedLinkedList (#6014)
Browse files Browse the repository at this point in the history
  • Loading branch information
Hardvan authored Oct 26, 2024
1 parent 2083d68 commit 59a8e1d
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 42 deletions.
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

0 comments on commit 59a8e1d

Please sign in to comment.