使用java中的链接列表乘以多项式

时间:2014-06-25 18:04:24

标签: java data-structures linked-list polynomials

这是我使用喜欢列表乘以两个多项式的代码。它工作正常,但问题是如果我乘以(3x ^ 2 + 5x + 3)*(4x ^ 3 + 5 ^ x + 2)

我得到的结果为12x ^ 5 + 15x ^ 2 + 6x ^ 2 + 20x ^ 4 + 25x ^ 2 + 10x + 12x ^ 3 + 15x +6。

但是我怎样才能使它输出带有类似指数的术语添加到12x ^ 5 + 43x ^ 2 + ..

public class LinkedPoly{
    static String exponent="";
    Node2 head;
    Node2 current;

    LinkedPoly(){
        head=null;

    }
    public void createList(int c,int e){
        head=new Node2(c,e,head);
    }
    public static LinkedPoly multiply(LinkedPoly list1,LinkedPoly list2){
        Node2 temp1=list1.head;
        Node2 temp2=list2.head;
        Node2 temp3=temp2;
        LinkedPoly multiplyList=new LinkedPoly();

        while(temp1!=null){
            while(temp2!=null){
                multiplyList.createList((temp1.coef*temp2.coef),(temp1.exp+temp2.exp)); 
                temp2=temp2.next;
            }
            temp2=temp3;
            temp1=temp1.next;
        }

        return multiplyList;
    }

2 个答案:

答案 0 :(得分:1)

一个想法是将值放入一个地图上,该地图用指示系数的值表示指数的度数。即,

Map<Integer,Integer> exponents = new HashMap<Integer,Integer>()
....
// inside your while loop
int newcoeff = temp1.coef*temp2.coef
int newexp   = temp1.exp+temp2.exp
if(exponents.containsKey(newexp))
    exponents.put(newexp, exponents.get(newexp) + newcoeff)
else 
    exponents.put(newexp,newcoeff)

然后将HashMap转换回列表。

答案 1 :(得分:0)

我希望我没有为你解决一些学校的家庭作业或锻炼。在那种情况下你不应该使用它!

此解决方案不使用Map,但它比@dfb发布的慢得多。

/**
 * @param list will be modified (merged).
 * @return the merged list param. 
 */
public static LinkedPoly merge(LinkedPoly list) {
    Node2 temp1 = list.head;

    while (temp1 != null) {
        Node2 iter = temp1; 
        Node2 temp2 = iter.next;
        while (temp2 != null) {
            if (temp1.exp == temp2.exp) {
                temp1.coef += temp2.coef;

                //removing temp2 form the source list
                iter.next = temp2.next;
            }
            iter = iter.next;
            temp2 = iter.next;
        }
        temp1 = temp1.next;
    }

    return list;
}

而不是LinkedPoly.multiply(a, b)只需致电LinkedPoly.merge(LinkedPoly.multiply(a, b))