mirror of https://github.com/01-edu/public.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.2 KiB
118 lines
3.2 KiB
5 months ago
|
## Circular Linked List
|
||
|
|
||
|
### Instructions
|
||
|
|
||
|
Create a circular single linked list data structure that implements the following methods:
|
||
|
|
||
|
- `at(int index)`: to access an element by its index.
|
||
|
- `add(int value)`: to add an element at the end of the list.
|
||
|
- `remove(int index)`: to remove an element by its index.
|
||
|
- `size()`: to return the size of the list.
|
||
|
|
||
|
Define these methods in an interface called `LinkedList`, and implement this interface in a class that you will create. Additionally, add a private method `next(Node node)` in your class that will be used in the other methods. This method should print the message "Go to next node" each time it is called.
|
||
|
|
||
|
### Explanation
|
||
|
|
||
|
A circular linked list is a linear data structure where each element is a separate object called a node. Each node contains two fields:
|
||
|
|
||
|
- `value`: stores the data.
|
||
|
- `next`: stores a reference to the next node in the list.
|
||
|
|
||
|
The first node is called the head of the list and the last node in a circular linked list points back to the first node, forming a circle. The list allows for efficient insertion and deletion of elements. However, accessing an element by its index requires traversing the list from the head to the desired position.
|
||
|
|
||
|
### Expected Interface
|
||
|
|
||
|
````java
|
||
|
public interface LinkedList {
|
||
|
int at(int index);
|
||
|
void add(int value);
|
||
|
void remove(int index);
|
||
|
int size();
|
||
|
}
|
||
|
|
||
|
### Expected Class
|
||
|
|
||
|
```java
|
||
|
public class CircularLinkedList implements LinkedList {
|
||
|
private Node head;
|
||
|
|
||
|
private class Node {
|
||
|
int value;
|
||
|
Node next;
|
||
|
|
||
|
Node(int value) {
|
||
|
this.value = value;
|
||
|
this.next = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public int at(int index) {
|
||
|
// Implementation for accessing an element by its index
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void add(int value) {
|
||
|
// Implementation for adding an element at the end of the list
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void remove(int index) {
|
||
|
// Implementation for removing an element by its index
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public int size() {
|
||
|
// Implementation getting the size of the list
|
||
|
}
|
||
|
|
||
|
private Node next(Node node) {
|
||
|
// Print the message "Go to next node"
|
||
|
}
|
||
|
}
|
||
|
````
|
||
|
|
||
|
### Usage
|
||
|
|
||
|
Here is a possible ExerciseRunner.java to test your class:
|
||
|
|
||
|
```java
|
||
|
public class ExerciseRunner {
|
||
|
public static void main(String[] args) {
|
||
|
LinkedList list = new CircularLinkedList();
|
||
|
|
||
|
// Add elements to the list
|
||
|
list.add(1);
|
||
|
list.add(2);
|
||
|
list.add(3);
|
||
|
|
||
|
// Access elements by index
|
||
|
System.out.println("Element at index 0: " + list.at(0)); // Expected output: 1
|
||
|
System.out.println("Element at index 1: " + list.at(1)); // Expected output: 2
|
||
|
System.out.println("Element at index 2: " + list.at(2)); // Expected output: 3
|
||
|
|
||
|
// Remove an element by index
|
||
|
list.remove(1);
|
||
|
System.out.println("Element at index 1 after removal: " + list.at(1)); // Expected output: 3
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Expected Output
|
||
|
|
||
|
```shell
|
||
|
$ javac *.java -d build
|
||
|
$ java -cp build ExerciseRunner
|
||
|
Go to next node
|
||
|
Element at index 0: 1
|
||
|
Go to next node
|
||
|
Element at index 1: 2
|
||
|
Go to next node
|
||
|
Go to next node
|
||
|
Element at index 2: 3
|
||
|
Go to next node
|
||
|
Go to next node
|
||
|
Element at index 1 after removal: 3
|
||
|
$
|
||
|
```
|