Skip to content

Sorted Linked List Added #5519

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 18 commits into from
Oct 3, 2024
Merged
Show file tree
Hide file tree
Changes from 14 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
@@ -0,0 +1,164 @@
package com.thealgorithms.datastructures.lists;

import java.util.ArrayList;

/**
* 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
* https://runestone.academy/ns/books/published/cppds/LinearLinked/ImplementinganOrderedList.html
* @author Muhammad Junaid Khalid
* @param int the type of elements in this list
*/

public class SortedLinkedList {
private Node head;
private Node tail;

public SortedLinkedList() {
this.head = null;
this.tail = null;
}

/**
* Inserts a new element into the sorted linked list.
* @param value the value to be inserted
*/
public void insert(int value) {
Node newNode = new Node(value);
if (head == null) {
this.head = newNode;
this.tail = newNode;
} else if (value < head.value) {
newNode.next = this.head;
this.head = newNode;
} else if (value > tail.value) {
this.tail.next = newNode;
this.tail = newNode;
} else {
Node temp = head;
while (temp.next != null && temp.next.value < value) {
temp = temp.next;
}
newNode.next = temp.next;
temp.next = newNode;
if (newNode.next == null) {
this.tail = newNode;
}
}
}

/**
* 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
*/
public boolean delete(int value) {
if (this.head == null) {
return false;
} else if (this.head.value == value) {
if (this.head.next == null) {
this.head = null;
this.tail = null;
} else {
this.head = this.head.next;
}
return true;
} else {
Node temp = this.head;
while (temp.next != null) {
if (temp.next.value == value) {
if (temp.next == this.tail) {
this.tail = temp;
}
temp.next = temp.next.next;
return true;
}
temp = temp.next;
}
return false;
}
}

/**
* 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
*/
public boolean search(int value) {
Node temp = this.head;
while (temp != null) {
if (temp.value == value) {
return true;
}
temp = temp.next;
}
return false;
}

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

/**
* Returns the minimum value in the sorted linked list.
* @return the minimum value
*/
public int minValue() {
return this.head.value;
}

/**
* Returns the maximum value in the sorted linked list.
* @return the maximum value
*/
public int maxValue() {
return this.tail.value;
}

/**
* Returns a string representation of the sorted linked list.
* @return a string representation of the sorted linked list
*/
@Override
public String toString() {
if (this.head != null) {
ArrayList<String> elements = new ArrayList<>();
Node temp = this.head;
while (temp != null) {
elements.add(String.valueOf(temp.value));
temp = temp.next;
}
return String.join(", ", elements);
} else {
return "";
}
}

public class Node {
public int value;
public Node next;

public Node() {
this.value = 0;
this.next = null;
}

public Node(int value) {
this.value = value;
this.next = null;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.thealgorithms.datastructures.lists;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.Test;

public class SortedLinkedListTest {

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

@Test
public void testDelete() {
SortedLinkedList list = new SortedLinkedList();
list.insert(5);
list.insert(3);
list.insert(7);
assertTrue(list.delete(5));
assertEquals("3, 7", list.toString());
assertFalse(list.delete(10));
}

@Test
public void testSearch() {
SortedLinkedList list = new SortedLinkedList();
list.insert(5);
list.insert(3);
list.insert(7);
assertTrue(list.search(5));
assertFalse(list.search(10));
}

@Test
public void testMinValue() {
SortedLinkedList list = new SortedLinkedList();
list.insert(5);
list.insert(3);
list.insert(7);
assertEquals(3, list.minValue());
}

@Test
public void testMaxValue() {
SortedLinkedList list = new SortedLinkedList();
list.insert(5);
list.insert(3);
list.insert(7);
assertEquals(7, list.maxValue());
}

@Test
public void testEmptyList() {
SortedLinkedList list = new SortedLinkedList();
assertEquals("", list.toString());
assertFalse(list.delete(5));
assertFalse(list.search(5));
}
@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 testIsEmptyAfterDeletion() {
SortedLinkedList list = new SortedLinkedList();
list.insert(10);
list.delete(10);
assertTrue(list.isEmpty());
}
}