问题是:定义一个构造函数,将TreeSet作为参数,并使用集合中的元素初始化一个链表。新表必须按字典递增的顺序排列。
这个方法将使用下面的类来实现:
public class LinkedList<T extends Comparable<T>> {
private class Node{
private T data;
private Node next;
private Node(T data){
this.data = data;
next = null;
}
}
private Node head;
public LinkedList(){
head = null;
}
现在我知道TreeSet本质上是排序的,所以我真正要做的就是从TreeSet中取出元素并把它放在这个链表的前面。但是我很难从集合中检索元素并将其添加到LinkedList中。我写了一个私人助手添加(T数据)方法,我正在使用它,但我不知道这是我应该如何接近它。我是数据结构的新手,所以对集合和它们的实现知之甚少。
public class LinkedList<T extends Comparable<T>> {
private class Node{
private T data;
private Node next;
private Node(T data){
this.data = data;
next = null;
}
}
private Node head;
public LinkedList(){
head = null;
}
public void add(T data){
Node n = new Node(data);
if(head == null){
head = n;
}
else{
n.next = head;
head = n;
}
}
public LinkedList(TreeSet<T> test){
Iterator<T> itr = test.iterator();
while(itr.hasNext()){
this.add(itr.next());
}
}
你需要解决的主要问题是,你需要将每个项目添加到列表的末尾,而不是开始。
将节点添加到列表的开头很容易:
public void addToHead(T data) {
Node node = new Node(data);
node.next = head;
head = node;
}
添加到结尾比较困难,因为你没有对尾部的引用。但解决方案相当简单:在您正在开发的构造函数中,保持对列表尾部的引用,以便您可以在链接的末尾而不是开始添加每个值。
问题包括"增加字典顺序"。
我的解决方案是不使用辅助方法:
public LinkedList(TreeSet<T> test){
Node currNode = null;
for(T data : test) {
Node newNode = new Node(data);
if(head == null) {
head = newNode;
currNode = head;
}
else {
currNode.next = newNode;
currNode = currNode.next;
}
}
}