从自定义列表中递归插入和删除



插入代码似乎一直工作得很好,直到最后一次插入,它没有按顺序添加它,而是将它放在列表的末尾。

public void insert(Comparable item)
{
    if ( this.first == null || item.compareTo(this.first.data) <= 0)
    {
        addFirst(item); 
    }
    else if( item.compareTo(this.first.data) > 0 )
    {
        addLast(item);
    }
    else
    {
        Node oldFirst = this.first;
        this.first = this.first.next;
        insert(item);
        this.first = oldFirst;
    }
}

这是它产生的输出。。。

6 Item(s) 
5
16
21
22
45
23

remove方法在删除项目后停止编译,我不知道为什么。

public Comparable remove(Comparable item)
{
    if( this.first == null )
    {
        return null;
    }
    Node oldFirst = this.first;
    if( this.first.next == null && this.first.data.equals(item) )
    {
        Comparable found = this.first.data;
        this.first = null;
        return found;
    }                
    this.first = this.first.next;
    if( this.first.data.equals(item) )
    {
        Comparable found = this.first.data;
        oldFirst.next = this.first.next;
        this.first = oldFirst;
        return found;
    }
    Comparable foundIt = remove(item);       
    return foundIt;
}

这是remove方法的输出。。。。

at List.remove(List.java:164)
Removed: 21. List has: 4 Item(s) 
at List.remove(List.java:164)
16
at List.remove(List.java:164)
22
45
at TestRecursion.main(TestRecursion.java:87)

我注意到,如果项大于第一个元素,则调用addLast。这不会给你一个排序列表。

考虑使用1、4、2、3调用insert。输出将完全按照这个顺序。1、4、2、3。

至于为什么删除会崩溃。。。

//what if its last item, and the data !.equals(item)?
if( this.first.next == null && this.first.data.equals(item) )
{
    Comparable found = this.first.data;
    this.first = null;
    return found;
}   
this.first = this.first.next;
//first could be null here if you are at end of list.
if( this.first.data.equals(item) )
{
    Comparable found = this.first.data;
    oldFirst.next = this.first.next;
    this.first = oldFirst;
    return found;
}

我建议您使用调试器。应该很快就能解决问题。

您的插入方法最后加了23,因为

 item.compareTo(this.first.data) > 0 

23实际上是您的第一个元素

public void insert(Comparable item)
{
    first = insertRecursively(first, item);
}
private static Node insert(Node node, Comparable item)
    if ( node == null || item.compareTo(node.data) <= 0)
    {
        Node created = new Node(item);
        created.next = node;
        return created;            
    }
    else
    {
        node.next = insertRecursively(node.next, item);
        return node;
    }
}

递归地执行此操作需要更改刚刚检查的first/next。

相关内容

  • 没有找到相关文章

最新更新