Java 中的 LinkedList 实现,具有泛型并增强了

Posted

技术标签:

【中文标题】Java 中的 LinkedList 实现,具有泛型并增强了【英文标题】:LinkedList implementation in Java with generics and enhanced for 【发布时间】:2011-04-17 12:36:15 【问题描述】:

请您检查一下我对单链表 (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 () 
    

       

【问题讨论】:

为什么不直接使用内置的 java.util.LinkedList?想到的唯一原因是这是一项家庭作业,或者您正试图了解链表和泛型的工作原理。 (如果这是作业,你应该用'homework'标记它) 【参考方案1】:

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

下一个方法应该是这样的,以使其工作:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

你为什么不用&lt;E&gt;

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


public class SinglyLinkedList<E> 

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

查看here 以获得全面的实施

【讨论】:

【参考方案4】: 您应该使用Iterable&lt;T&gt; 而不是Iterable&lt;Object&gt;add(Node) 实际上并没有将对象添加到列表中。 MyLinkedListIterator&lt;T&gt; 应该实现 Iterator&lt;T&gt;。 如果列表为空,MyLinkedListIterator.hasNext() 将抛出 NullPointerExceptionMyLinkedListIterator.next() 不会移动到列表中的下一项。

【讨论】:

【参考方案5】:

您应该从iterator 方法返回一个Iterator&lt;T&gt;,并且还应该扩展Iterable&lt;T&gt; 而不是Iterable&lt;Object&gt;

此外,您的MyLinkedListIterator&lt;T&gt; 应该实现Iterator&lt;T&gt;。那么它应该可以工作了。

【讨论】:

以上是关于Java 中的 LinkedList 实现,具有泛型并增强了的主要内容,如果未能解决你的问题,请参考以下文章

LinkedList实现原理

java-ArrayList中去重复字符串或重复对象LinkedList集合泛型增强for静态导入可变参数asList()方法集合嵌套

iOS 框架中的 LinkedList 等价物是啥?

集合泛型回顾加强

Java数据结构之表的增删对比---ArrayList与LinkedList之一

java集合的实现细节--ArrayList和LinkedList