Как создать метод get с узлами общего типа в Java - PullRequest
0 голосов
/ 18 марта 2019

Я реализую циклическую структуру данных DoublyLinkedList.Как и в односвязном списке, узлы в двусвязном списке имеют ссылку на следующий узел, но в отличие от односвязного списка, узлы в двусвязном списке также имеют ссылку на предыдущий узел.

Дополнительно,поскольку список является циклическим, ссылка «следующий» в последнем узле в списке указывает на первый узел в списке, а ссылка «предыдущая» в первом узле в списке указывает на последний узел в списке.

Мне нужна помощь при запуске метода get, я искал вокруг и не мог найти ничего, что могло бы мне помочь, так как я работаю с Generic Type.Мне нужно вернуть E, и все остальные примеры показывают мне это с int в качестве примера.Вот мой код:

public class DoublyLinkedList<E>
{
private Node first;
private int size;

@SuppressWarnings("unchecked")
public void add(E value)
{
    if (first == null)
    {
        first = new Node(value, null, null);
        first.next = first;
        first.prev = first;
    }
    else
        {
        first.prev.next = new Node(value, first, first.prev);
        first.prev = first.prev.next;
    }
    size++;
}
private class Node<E>
{
    private E data;
    private Node next;
    private Node prev;

    public Node(E data, Node next, Node prev)
    {
        this.data = data;
        this.next = next;
        this.prev = prev;
    }
}
@SuppressWarnings("unchecked")
public void add(int index, E value)
{
    if (first.data == null)
    {
        throw new IndexOutOfBoundsException();
    } else if (index == 0)
    {
        first = new Node(value, first.next, first.prev);
    }
    else
        {
        Node current = first;
        for (int i = 0; i < index - 1; i++)
        {
            current = current.next;
        }
        current.next = new Node(value, current.next, current.prev);
    }
}
@SuppressWarnings("unchecked")
public void remove(int index)
{
    if (first.data == null)
    {
        throw new IndexOutOfBoundsException();
    }
    else if (index == 0)
    {
        first = first.next;
    }
    else
        {
            Node current = first.next;
            for (int i = 0; i < index - 1; i++)
        {
            current = current.next;
        }
        current.next = current.next.next;
    }
    size--;
}

Я не могу придумать, как начать с этого, но в основном этот метод должен возвращать элемент с указанным индексом в списке.Если параметр index недействителен, должно быть сгенерировано исключение IndexOutOfBoundsException.

public E get(int index)
{

}

Кроме того, мой метод удаления не точный, но я сам его выясню, мне просто нужна помощь с моим методом get,

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Еще одна проблема, с которой я столкнулся, заключалась в том, что в моем классе узлов у меня был там, когда я мог двигаться дальше без него.Давайте обновим его до

private class Node
{
    private E data;
    private Node next;
    private Node prev;

    public Node(E data, Node next, Node prev)
    {
        this.data = data;
        this.next = next;
        this.prev = prev;
    }
}

И теперь мой getMethod () будет выглядеть следующим образом:

@SuppressWarnings("unchecked")
public E get(int index)
{
    if(index < 0)
    {
        throw new IndexOutOfBoundsException();
    }
    if(index > size)
    {
        throw new IndexOutOfBoundsException();
    }
    Node current = first;
    for (int i = 0; i < index; i++)
    {
        current = current.next;
    }
    return current.data;
}
0 голосов
/ 19 марта 2019

Я понял это, я просто шокирован, что я не получил никаких ответов на этот вопрос.В любом случае, я собираюсь написать несколько комментариев, чтобы они как-то помогли будущим зрителям, которые борются с этим.

@SuppressWarnings("unchecked")
public E get(int index)
{
    if(index < 0) //The index needs to be above 0.
    {
        throw new IndexOutOfBoundsException(); 
    }
    if(index > size) //Since we're going to run a for loop, we need to make sure the index doesn't go past the size of the list. 
    {
        throw new IndexOutOfBoundsException();
    }
    Node current = first; //We want to create another node to perform this method.
    for (int i = 0; i < index; i++) //We are going to set i to 0 and loop around this for loop until we reach the index. 
    {
        current = current.next;
    }
    return (E) current.data; //Since we are working with generics, we need to return a type E, and it needs to be in parenthesis so it gets that object.
}
...