如何实现排序列表

时间:2015-05-16 23:25:08

标签: java list

所以我有一个名为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();
    }
}

1 个答案:

答案 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);
}
相关问题