所以我有一个名为List
的类和一个名为SortedList
的类,它继承了类List。还有一个叫做node的类。我创建了另一个包含打印方法的类。
但是,每次我插入三个名称,例如,我调用打印方法,它只打印我插入的姓氏。所以我的问题是:这个代码是否生成一个排序列表?如果是这样,为什么只打印姓氏?
列表类:
public class List {
protected Node head;
protected int length;
public void list()
{
head=null;
length=0;
}
public boolean isEmpty()
{
return head==null;
}
public Node insert(Item a)
{
length++;
head=new Node(a, head);
return head;
}
SortList类:
public class SortList extends List {
private Node head;
public SortList()
{
this.head=null;
}
public Node getFirst()
{
return head;
}
public Node Insert(Item newitem)
{
Node node = new Node(newitem);
Node previous = null;
Node current = head;
while(current!=null && current.getValue().less(newitem))
{
previous=current;
current=current.getNext();
}
if(previous==null)
{
head=node;
}
else
{
previous.setNext(node);
node.setNext(current);
}
return head;
}
public void printlist()
{
Node current = head; //ΑΡΧΗ ΤΗΣ ΛΙΣΤΑΣ.
while(current!=null)
{
current.print();
current = current.getNext();
}
}
节点类:
public class Node {
private Item info;
private Node next;
public Node(Item dat)
{
info=dat;
}
public Node (Item dat, Node b)
{
info=dat;
next=b;
}
public Item getValue()
{
return info;
}
public void setNext(Node a)
{
next=a;
}
public Node getNext()
{
return next;
}
public void print()
{
info.print();
}
}
答案 0 :(得分:3)
在List
的实施中,insert()
方法存在重大错误:
public Node insert(Item a)
{
length++;
head=new Node(a, head);
return head;
}
您不会将新元素附加到列表的末尾,而是每次都替换列表的头部,从而丢弃前一个元素。
这可以解释为什么你总是只看到你插入的最后一个元素。
编辑:事实证明,insert()
方法确实有效,因为您在节点构造函数中设置了对下一个节点的引用。
但是,在排序列表中,您有一个未设置下一个节点的插入案例:
if(previous==null)
{
head=node;
}
我是您的排序列表,您不必在节点的构造函数中设置下一个元素。在所有其他情况下,您在insert()
方法中设置下一个元素,但在这种情况下不是。如果要插入的元素是列表中最小的元素,previous
为空,这是正确的 - 您的新元素是列表的新head
。但是,由于您没有设置新元素的后继元素,因此列表中的所有元素现在都已消失。
如果您在列表中插入的最后一个元素是最小的,那么最后一个元素也将是剩下的唯一元素,并且您只打印出最后一个元素。
尝试设置后继者:
if(previous==null)
{
head=node;
head.setNext(current);
}