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】:你为什么不用<E>
public class Node<E>
E data;
Node<E> next;
public class SinglyLinkedList<E>
Node<E> start;
int size;
.......
查看here 以获得全面的实施
【讨论】:
【参考方案4】: 您应该使用Iterable<T>
而不是Iterable<Object>
。
add(Node)
实际上并没有将对象添加到列表中。
MyLinkedListIterator<T>
应该实现 Iterator<T>
。
如果列表为空,MyLinkedListIterator.hasNext()
将抛出 NullPointerException
。
MyLinkedListIterator.next()
不会移动到列表中的下一项。
【讨论】:
【参考方案5】:您应该从iterator
方法返回一个Iterator<T>
,并且还应该扩展Iterable<T>
而不是Iterable<Object>
。
此外,您的MyLinkedListIterator<T>
应该实现Iterator<T>
。那么它应该可以工作了。
【讨论】:
以上是关于Java 中的 LinkedList 实现,具有泛型并增强了的主要内容,如果未能解决你的问题,请参考以下文章
java-ArrayList中去重复字符串或重复对象LinkedList集合泛型增强for静态导入可变参数asList()方法集合嵌套