我需要使用泛型实现自定义链表。
这是我做过的事情
public class Node {
Node next;
Object data;
public Node(Object data) {
next = null;
this.data = data;
}
public Object getData() {
return data;
}
public void setData(Object dataValue) {
data = dataValue;
}
public Node getNext() {
return next;
}
public void setNext(Node nextValue) {
next = nextValue;
}
}
public class LinkedList {
private Node head;
private int size;
public LinkedList() {
head = new Node(null);
size = 0;
}
public void add(Object data) {
Node node = new Node(data);
Node current = head;
while (current.getNext() != null) {
current = current.getNext();
}
current.setNext(node);
size++;
}
public int getSize() {
return size;
}
public String toString() {
Node current = head.getNext();
String elements = "";
while (current != null) {
elements += "[" + current.getData().toString() + "]";
current = current.getNext();
}
return elements;
}
}
public class Main {
public static void main(String[] args) {
System.out.println("Hello there!");
LinkedList list = new LinkedList();
list.add("First node");
list.add("Second node");
list.add("Third node");
list.add("Fourth node");
list.add("Fifth node");
System.out.println("Linked list contains " + list.getSize() + " nodes");
System.out.println("Here they are: " + list);
}
}
我不知道或者只是不太明白我应该在哪里使用泛型以及如何使用?有什么想法吗?
答案 0 :(得分:5)
您使用Node
课开始;特别是,你可以使它包含任何类型的数据。
你这样做:
在班级
中引入泛型类型参数public class Node<T> { }
只要您Object
,请将其替换为T
。
T data;
请务必更新对其他Node
实例的引用,以便它们使用相同的通用参数。
Node<T> next;
现在,您可以用类似的方式解决LinkedList
课程中的问题。
在班级
中引入泛型类型参数public class LinkedList<T> { }
将add
的参数从Object
更改为T
。
public void add(T data) { }
将泛型添加到Node
个实例,以便您不使用原始类型。
private Node<T> head;
答案 1 :(得分:1)
您应该考虑通过Generics tutorial。具体来说,请阅读“通用类型”部分。
基本上,只需将它们声明为LinkedList<T>
和Node<T>
,您的LinkedList和Node实现就必须是通用的。一旦将类更改为通用类,就可以实例化参数化的LinkedList,例如:
LinkedList<String> stringList = new LinkedList<>();
LinkedList现在是类型安全的,只允许存储字符串。