Реализация LinkedList в Java с обобщениями и улучшена для - PullRequest
4 голосов
/ 27 сентября 2010

Мне нужно, чтобы вы ознакомились с моей реализацией Единого связанного списка (SLL), пожалуйста. Реализация должна использовать дженерики и иметь возможность использовать расширенный для.

Проблема в том, что когда я for (Number n : list) являюсь list a MyLinkedList<Integer> или MyLinkedList<Double>, я получаю сообщение об ошибке: «Несоответствие типов: невозможно преобразовать тип элемента из объекта в Число».

Это то, что у меня есть. Части, в которых я не очень уверен, - это дженерики и итераторы.

Заранее спасибо.

import java.util.Iterator;

public class MyLinkedList<T> implements Iterable<Object>
{
    private Node head;

    public MyLinkedList ()
    {
        head = null;
    }

    public void add (Node n)
    {
        if (head == null)
        {
            head = n;
        }

        else
        {
            Node node = head;
            while (node.next != null) 
            {
                node = node.next;
            }
            node = n;
        }
    }

    public Iterator iterator() 
    {
        return new MyLinkedListIterator (head);
    }

    public int size () 
    {
        int ret = 0;
        MyLinkedListIterator it = new MyLinkedListIterator (head);
        while (it.hasNext ())
        {
            it.next();
            ret++;
        }

        return ret;
    }

    public Node getHead ()
    {
        return head;
    }
}

class MyLinkedListIterator<T> implements Iterator
{
    private Node node;

    public MyLinkedListIterator (Node h)
    {
        node = h;
    }

    public MyLinkedListIterator (MyLinkedList<T> l)
    {
        this(l.getHead ());
    }

    public boolean hasNext () 
    {
        if (node.next == null)
        {
            return false;
        }

        else
        {
            return true;
        }
    }

    public Object next () 
    {
        return node.next;
    }

    public void remove () 
    {

    }   
}

Ответы [ 5 ]

8 голосов
/ 27 сентября 2010
  • Вы должны иметь Iterable<T> вместо Iterable<Object>.
  • add(Node) фактически не добавляет объект в список.
  • MyLinkedListIterator<T> должен реализовать Iterator<T>.
  • MyLinkedListIterator.hasNext() выдает NullPointerException, если список пуст.
  • MyLinkedListIterator.next() не перемещается к следующему элементу в списке.
2 голосов
/ 27 сентября 2010

Вы должны вернуть Iterator<T> из метода iterator, и вы также должны расширить Iterable<T> вместо Iterable<Object>.

Кроме того, ваш MyLinkedListIterator<T> должен реализовать Iterator<T>.Тогда это должно работать.

1 голос
/ 27 сентября 2010

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

1 голос
/ 27 сентября 2010

Почему вы не используете <E>

public class Node<E>{
 E data;
 Node<E> next;
}

public class SinglyLinkedList<E> {

 Node<E> start;
 int size;
 .......
}

Смотрите здесь для комплексной реализации

0 голосов
/ 14 октября 2013

Расширение точки: MyLinkedListIterator.next () не перемещается к следующему элементу в списке.

следующий метод должен быть примерно таким, чтобы он работал:

public T next() {
    if(isFirstNode) {
        isFirstNode = false;
        return node.data;
    }
    node = node.next;
    return node.data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...