Java中的链表实现与泛型和增强的

时间:2010-09-26 21:20:31

标签: java generics data-structures iterator iterable

我需要您查看我的单一链接列表(SLL)的实现。实现应该使用泛型并且能够使用增强的for。

问题在于,当我for (Number n : list) list 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 个答案:

答案 0 :(得分:8)

  • 您应该Iterable<T>而不是Iterable<Object>
  • add(Node)实际上并没有将对象添加到列表中。
  • MyLinkedListIterator<T>应该实施Iterator<T>
  • 如果列表为空,
  • MyLinkedListIterator.hasNext()将抛出NullPointerException
  • MyLinkedListIterator.next()不会移动到列表中的下一个项目。

答案 1 :(得分:2)

您应该从Iterator<T>方法返回iterator,并且还应该Iterable<T>而不是Iterable<Object>

此外,您的MyLinkedListIterator<T>应该实施Iterator<T>。然后它应该工作。

答案 2 :(得分:1)

为什么不使用<E>

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

public class SinglyLinkedList<E> {

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

查看here以获得全面的实施

答案 3 :(得分:1)

除了其他人所说的,你可能不应该在公共方法中暴露Node - 节点应该是实现的纯粹内部方面。

答案 4 :(得分:0)

扩展点:MyLinkedListIterator.next()不会移动到列表中的下一个项目。

下一个方法应该是沿着这些方向运行的东西:

public T next() {
    if(isFirstNode) {
        isFirstNode = false;
        return node.data;
    }
    node = node.next;
    return node.data;
}