Я это абстрактный класс, я уверен, реализации, где реализованы все функции, должно быть сделано с помощью рекурсии:Java - вставка/удаление в отсортированный список recursivey
public abstract class List<E> implements Iterable<E> {
protected class Node<T> {
protected Node(T data) {
this.data = data;
}
protected T data;
protected Node<T> next;
}
public abstract void insert(E data);
public abstract void remove(E data);
public abstract E retrieve(int index);
public abstract boolean search(E data);
protected Node<E> head;
}
Ниже моя реализация до сих пор. Я уверен, что правильно выполнил поиск и извлечение методов, а также большую часть метода удаления. Одна из моих проблем - это моя ошибка с методом вставки (мне не нужен рабочий код, но, возможно, псевдокод, как объяснение того, как вы вставляете, когда абстрактный класс принимает только аргумент данных, что приводит к необходимости использования частного класса). Другой вопрос находится в этом состоянии метода REMOVE:
if (key.compareTo(temp.data) == 0){
}
Я не знаю, как я должен удалить узел головы, учитывая есть доступ только к текущему и следующему узлу. Любая помощь будет оценена!
import java.util.Iterator;
import java.util.Random;
public class SortedList<E extends Comparable<? super E>> extends List<E> {
public static void main(String[] args) {
Random rand = new Random(1);
SortedList<Integer> list = new SortedList<Integer>();
list.insert(1);
System.out.println(list.search(1));
}
public Iterator<E> iterator() {
return new Iterator<E>() {
public boolean hasNext() {
return curr != null;
}
public E next() {
E temp = curr.data;
curr = curr.next;
return temp;
}
public void remove() {
throw new UnsupportedOperationException();
}
private Node<E> curr = (Node<E>)head;
};
}
public void insert(E data) {
Node<E> temp = new Node<E>(data);
Node<E> curr = head;
if (head == null || data.compareTo(head.data) < 0) {
temp.next = head;
head = temp;
}
insert(curr, data);
}
private void insert(Node<E> curr, E data){
if (curr.next == null) {
curr.next.data = data;
} else {
curr.next.insert(curr, data);
}
}
public void remove(E data) {
Node<E> curr = head;
remove(curr, data);
}
private void remove(Node<E> temp, E key){
if (temp == null){
return;
}
if (key.compareTo(temp.data) == 0){
}
if (key.compareTo(temp.next.data) == 0){
temp.next = temp.next.next;
return;
}
if (key.compareTo(temp.next.data) < 0){
remove(temp.next, key);
}
}
public E retrieve(int index)
{
Node<E> curr = head;
int counter = 0;
return retrieve(curr, index, counter);
}
private E retrieve(Node<E> temp, int idx, int c)
{
if (idx == c){
return temp.data;
}
return retrieve(temp.next, idx, c++);
}
public boolean search(E data)
{
Node<E> curr = head;
return search(curr, data);
}
private boolean search(Node<E> temp, E key)
{
if (temp == null){
return false;
}
if (key.compareTo(temp.data) == 0){
return true;
}
if (key.compareTo(temp.data) < 0){
return search(temp.next, key);
}
return false;
}
}
Код в формате Psuedo был бы оценен для вставки. Для условия удаления, о котором вы упомянули, я понимаю эту логику, но моя проблема связана с этой реализацией класса sortedlist, нет предыдущего узла, и способ, которым мы должны «удалить» узел, - установить node.next на node.next .следующий. В этом случае нет «.next», который указывает на головной узел, где я потерян. – witcheR
С помощью текущего узла вы можете проверить любое количество узлов, которое вы хотите, если знаете, сколько нужно проверить, цепляя «next». Я могу проверить curr.next.next. Если я хочу 3 вниз по линии. Нет необходимости иметь «предыдущий» узел, если разумно использовать временные узлы и выполнять проверку линии. – Brion
@abdi почему вам нужен следующий узел, указывающий на голову? Если вам нужно вставить в голову, то просто установите узел узла Node на новый узел, который, как я считаю, вы сейчас делаете правильно. Для удаления головы вы просто укажете temp.next = head.next. Затем head = temp. Невозможно получить доступ к этому старому значению головы, и он будет очищен с помощью gc. – Brion