在本文中,我们将讨论开发自定义数据结构以及如何使用 Java 创建列表。
在编写代码之前,我们需要了解一些概念。
列表:列表是一种数据结构,表示数据(节点)的集合或排列,每个节点都有指向下一个节点的指针,这意味着索引无法访问节点。下图显示了包含三个元素(节点)的列表,以及”第一个”和”最后一个”指针,以便访问列表数据。
节点:节点是表示列表中每个元素的结构。节点至少有一个指向下一个元素的指针和一个包含特定信息或数据的字段。在具有一个元素的列表中,第一个和最后一个指针指向同一个元素。
下一页,第一次,最后一个(指针): 这些是允许访问列表中的节点的指针。
空列表:没有元素的列表,”第一个”和”最后一个”节点为空。
让我们来编码
首先 Node
类:
package app;
public class Node <T> {
private Node next;
private Node prev;
private T data;
//getters and setters omited..
}
在 Node
类中,需要强调的要点是使用通用<T>传递节点的数据类型并使列表可重用。
之后,我们需要实现 CustomList
类:
package app;
import java.util.Iterator;
public class CustomList<T> implements Iterable<Node> {
private Node first;
private Node last;
public CustomList() {
first = last = null;
}
public boolean isEmpty(){
return first == null;
}
public void push(T data) {
Node tempo = new Node();
tempo.setData(data);
tempo.setNext(null);
if (first == null) {
tempo.setPrev(null);
first = last = tempo;
} else {
tempo.setPrev(last);
last.setNext(tempo);
last = tempo;
}
}
@Override
public Iterator<Node> iterator() {
return new ListIterator(first);
}
}
CustomList
类实现 Iterable
,它允许我们在列表中使用”for”。
在下一步中,我们将创建自己的 ListIterator
实现:
package app;
import java.util.Iterator;
public class ListIterator implements Iterator<Node> {
private Node current;
public ListIterator(Node first) {
current = first;
}
@Override
public boolean hasNext() {
return current != null;
}
@Override
public Node next() {
Node tempo = current;
current = current.getNext();
return tempo;
}
}
需要传递构造函数中列表的第一个节点,以便根据需要使用指针(下一步,前一页)访问列表的内容。我们还必须重载 next()
和 hasNext()
方法推(新人(“克拉克”,”肯特”,35));
列表1.推(新人(“布鲁斯”,”韦恩”,40));
列表1.推(新人(“琳达”,”卡特”,30));
(节点节点 : list1) |
系统.out.println(节点.getData(toString));
}
自定义列表\lt;Car> 列表2 = 新的自定义列表\lt;>();
列表2.推(新车(200,”车1″);汽车(200,”车1″);
列表2.推(新车(100,”车2″));
(节点节点 : list2) |
系统.out.println(节点.getData(toString));
}
}
}
在上面的代码中,我们注意到我们可以用 for
结构迭代列表。
这是所有的人,我们已经实现了我们的自定义列表与Java通过 Iterator
实现。