当它应该返回newList时,导数方法正在改变原始列表

时间:2014-08-07 01:12:01

标签: java linked-list

我有一个使用链接列表操作多项式的任务。赋值的一部分是取多项式的一阶,二阶和三阶导数。我所有的方法都是单独的。然而,在运行第一个导数方法之后,它将原始输入列表更改为一阶导数 - 我不想要的东西。

这是我的方法:

public ObjectList derivative(ObjectList list1) {
    newList = new ObjectList();
    ObjectListNode p = list1.getFirstNode();
    while (p != null) {
        Term t1 = (Term) p.getInfo();
        if (t1.getExp() == 0) {
            t1.setCoeff(0);
            attach(0,0);
            p = p.getNext();
        }
        else {
            t1.setCoeff(t1.getCoeff()*t1.getExp());
            t1.setExp(t1.getExp() - 1);
            attach(t1.getCoeff(), t1.getExp());
            p = p.getNext();
        }
    }
    return newList;
}

如您所见,衍生方法的回报为newList。但是,该方法正在更改原始列表。

在我的主要内容中,我有类似的东西:

ObjectList poly1;

System.out.println("\nEnter a polynomial (for derivatives): ");
poly1 = p.getPolynomial();

System.out.println("First derivative: ");
p.displayPoly(p.derivative(poly1));

System.out.println("\nTest:");
p.displayPoly(poly1);

poly1最终会改变。

我对我一直使用的控制台的输入是:3x^4+2x^3+1x^2-1x^1+8x^0

这可能是一个非常简单的错误,但由于某些原因我无法抓住它。感谢您的帮助,我很感激!

编辑:衍生方法中的附加方法:

private void attach (int coeff, int exp) {
    Term t = new Term (coeff, exp);
    newList.addLast(t);
}

1 个答案:

答案 0 :(得分:2)

您只是在不添加任何内容的情况下初始化newList实例(使用newList = new ObjectList()),并且您正在更新输入列表list1的条款。

您没有发布ObjectListObjectListNode的代码,因此我无法说明您应该调用的确切方法,以便将节点添加到newList,但您应该为输入列表的每个节点添加一个新节点到newList,初始化它以包含输入列表的相应Term的副本,并更新newList的Term而不是输入列表的Term。 / p>

编辑:

您未将newList传递给attach,因此您添加字词的列表与您在derivative方法中初始化的列表不同。此外,您不应该在输入列表的条款上调用setCoeffsetExp,因为您不想更改它。

因此你应该替换:

        t1.setCoeff(0);
        attach(0,0);

with:

        attach(0,0);

并替换:

        t1.setCoeff(t1.getCoeff()*t1.getExp());
        t1.setExp(t1.getExp() - 1);
        attach(t1.getCoeff(), t1.getExp());

with:

        attach(t1.getCoeff()*t1.getExp(), t1.getExp() - 1);

但是,如果要更新newList方法中创建的derivative,则应将newList传递给attach方法,或取消attach方法并将其内容移至派生方法:

public ObjectList derivative(ObjectList list1) {
    newList = new ObjectList();
    ObjectListNode p = list1.getFirstNode();
    while (p != null) {
        Term t1 = (Term) p.getInfo();
        if (t1.getExp() == 0) {
            Term t = new Term (0,0);
            newList.addLast(t);
            p = p.getNext();
        }
        else {
            Term t = new Term (t1.getCoeff()*t1.getExp(), t1.getExp() - 1);
            newList.addLast(t);
            p = p.getNext();
        }
    }
    return newList;
}